ホームページ >バックエンド開発 >PHPチュートリアル >複数のアレイに関するディスカッションを結合する

複数のアレイに関するディスカッションを結合する

WBOY
WBOYオリジナル
2016-06-23 14:21:40884ブラウズ

順列と組み合わせ

3 つの配列があると仮定します (実際には配列の数は不明):
$arr1 = array(1, 2, 3, 4);
$arr2 = array(10, 20, 30, 40);
$ arr3 = array(100, 200, 300, 400);

達成される結果:
array(
array(1,10,100),
array(1,10,200),
array(1,10,300),
配列(1,10,400)、
配列(1,20,100)、
配列(1,20,200)、
配列(1,20,300)、
配列(1,20,400)、
配列(1,30,10 0) 、

);
再帰は使いたくないですが、実装できます

ディスカッションへの返信 (解決策)

この投稿は、xuzuning によって 2013-09-12 07:58 に最終編集されました。 :13

れーれー れーれー

そうですね。 #1 に問題があります。

$a = [1, 2];$b = ['A', 'B', 'C'];$c = ['a', 'b'];$d = Descartes($a, $b, $c);print_r($d);function Descartes() {  $d = func_get_args();  if( count($d) < 2 ) return current($d);  $n = array_product( array_map('count', $d) );  array_walk( $d, function(&$v, $k, $n) {      $v = array_chunk( call_user_func_array('array_merge', array_pad([$v], $n/count($v), $v)), 1);      if($k==0) sort($v);    }, $n);  array_unshift($d, 'array_merge');  $d = call_user_func_array('array_map', $d);  array_multisort(array_map(function($v) { return $v[0]; }, $d), $d);  return $d;}
Array(    [0] => Array        (            [0] => 1            [1] => A            [2] => a        )    [1] => Array        (            [0] => 1            [1] => A            [2] => b        )    [2] => Array        (            [0] => 1            [1] => B            [2] => a        )    [3] => Array        (            [0] => 1            [1] => B            [2] => b        )    [4] => Array        (            [0] => 1            [1] => C            [2] => a        )    [5] => Array        (            [0] => 1            [1] => C            [2] => b        )    [6] => Array        (            [0] => 2            [1] => A            [2] => a        )    [7] => Array        (            [0] => 2            [1] => A            [2] => b        )    [8] => Array        (            [0] => 2            [1] => B            [2] => a        )    [9] => Array        (            [0] => 2            [1] => B            [2] => b        )    [10] => Array        (            [0] => 2            [1] => C            [2] => a        )    [11] => Array        (            [0] => 2            [1] => C            [2] => b        ))

そうですね、これは正しいです。 #1 に問題があります。

$a = [1, 2];$b = ['A', 'B', 'C'];$c = ['a', 'b'];$d = ['D', 'E', 'F'];$r = Descartes($a, $b, $c);$r = Descartes($a, $b, $c, $d);print_r( array_map(function($v) { return join(',', $v); }, $r) );function Descartes() {  $d = func_get_args();  if( count($d) < 2 ) return current($d);  $n = array_product( array_map('count', $d) );  array_walk( $d, function(&$v, $k, $n) {      $v = array_chunk( call_user_func_array('array_merge', array_pad([$v], $n/count($v), $v)), 1);    }, $n);  foreach($d as $i=>$t) {    if($i == 0) {      $r = $t;    }else {      array_multisort(array_map(function($v) { return $v[0]; }, $r), $r);      $r = array_map('array_merge', $r, $t);    }  }  return $r;}
Array(    [0] => 1,A,a,D    [1] => 1,A,a,E    [2] => 1,A,a,F    [3] => 1,A,b,D    [4] => 1,A,b,E    [5] => 1,A,b,F    [6] => 1,B,a,D    [7] => 1,B,a,E    [8] => 1,B,a,F    [9] => 1,B,b,D    [10] => 1,B,b,E    [11] => 1,B,b,F    [12] => 1,C,a,D    [13] => 1,C,a,E    [14] => 1,C,a,F    [15] => 1,C,b,D    [16] => 1,C,b,E    [17] => 1,C,b,F    [18] => 2,A,a,D    [19] => 2,A,a,E    [20] => 2,A,a,F    [21] => 2,A,b,D    [22] => 2,A,b,E    [23] => 2,A,b,F    [24] => 2,B,a,D    [25] => 2,B,a,E    [26] => 2,B,a,F    [27] => 2,B,b,D    [28] => 2,B,b,E    [29] => 2,B,b,F    [30] => 2,C,a,D    [31] => 2,C,a,E    [32] => 2,C,a,F    [33] => 2,C,b,D    [34] => 2,C,b,E    [35] => 2,C,b,F)


読むと少しめまいを感じます。これまであまり使用されなかった関数がたくさん使用されています。しかし、これらの角括弧はどのように書かれるのでしょうか? 5.3.12 は
$a = [1, 2];$b = ['A', 'B', 'C'];$c = ['a', 'b'];$d = ['D', 'E', 'F'];$r = Descartes($a, $b, $c);$r = Descartes($a, $b, $c, $d);print_r( array_map(function($v) { return join(',', $v); }, $r) );function Descartes() {  $d = func_get_args();  if( count($d) < 2 ) return current($d);  $n = array_product( array_map('count', $d) );  array_walk( $d, function(&$v, $k, $n) {      $v = array_chunk( call_user_func_array('array_merge', array_pad([$v], $n/count($v), $v)), 1);    }, $n);  foreach($d as $i=>$t) {    if($i == 0) {      $r = $t;    }else {      array_multisort(array_map(function($v) { return $v[0]; }, $r), $r);      $r = array_map('array_merge', $r, $t);    }  }  return $r;}
をサポートしていません

array() は [] に簡略化できます php5.4 でのみ利用可能ですか? php5.3 であることをどうやって思い出すことができますか?

簡単なコメント:

Array(    [0] => 1,A,a,D    [1] => 1,A,a,E    [2] => 1,A,a,F    [3] => 1,A,b,D    [4] => 1,A,b,E    [5] => 1,A,b,F    [6] => 1,B,a,D    [7] => 1,B,a,E    [8] => 1,B,a,F    [9] => 1,B,b,D    [10] => 1,B,b,E    [11] => 1,B,b,F    [12] => 1,C,a,D    [13] => 1,C,a,E    [14] => 1,C,a,F    [15] => 1,C,b,D    [16] => 1,C,b,E    [17] => 1,C,b,F    [18] => 2,A,a,D    [19] => 2,A,a,E    [20] => 2,A,a,F    [21] => 2,A,b,D    [22] => 2,A,b,E    [23] => 2,A,b,F    [24] => 2,B,a,D    [25] => 2,B,a,E    [26] => 2,B,a,F    [27] => 2,B,b,D    [28] => 2,B,b,E    [29] => 2,B,b,F    [30] => 2,C,a,D    [31] => 2,C,a,E    [32] => 2,C,a,F    [33] => 2,C,b,D    [34] => 2,C,b,E    [35] => 2,C,b,F)

array() を [] に単純化することと、クロージャの書き込みを使用することを除いて、新しいことは何もありません
クロージャは create_function 関数で書き換えることができます

array() を [] に単純化することを除いて、クロージャの記述方法以外に新しいものはありません。create_function 関数を使用してクロージャを書き換えることができます。5.3 にはこの構文がありません。 PHP の構文が JavaScript の構文にどんどん似てきているように感じるのはなぜですか?
モデレータのおかげで、私も比較のために 1 つ書きました。後で使うために保存しておきます。

えー
これは単純明快です

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。