2017-08-12 14 views
-1

配列$ poleが$ transposeの配列にどのように変化するのか理解できません。このphpコードはどのように機能しますか(call_user_func_arrayとarray_map)?

どのように動作しますか?コメントには、両方の配列がどのように見えるか、スクリプトを実行する特定の時点で何が表示されているかが表示されます。

これらの例では、NはNULLを意味します。 $transposeの配列にNULLSを埋め込む方法は?私はそこに1つのNULLを入力します、私は理解しますが、私は他のすべてのNULLSの起源を理解できません。

<?php 
$numbers = array(5, 3, 1, 3, 8, 7, 4, 1, 1, 3); 

foreach ($numbers as $e){ 
$poles[] = array_fill(0, $e, 1); 
} 

array_unshift($poles, NULL); 
echo "<pre>" . var_dump($poles) . "</pre>"; 
/*var_dump($poles); 
[0] N 
[1] 1 1 1 1 1 
[2] 1 1 1 
[3] 1 
[4] 1 1 1 
[5] 1 1 1 1 1 1 1 1 
[6] 1 1 1 1 1 1 1 
[7] 1 1 1 1 
[8] 1 
[9] 1 
[10] 1 1 1 
*/echo "</br>------------------------------</br>"; 

$transpose = call_user_func_array('array_map', $poles); 
echo "<pre>" . var_dump($transpose) . "</pre>"; 
/*var_dump($transpose); 
[0] 1 1 1 1 1 1 1 1 1 1 
[1] 1 1 N 1 1 1 1 N N 1 
[2] 1 1 N 1 1 1 1 N N 1 
[3] 1 N N N 1 1 1 N N N 
[4] 1 N N N 1 1 N N N N 
[5] N N N N 1 1 N N N N 
[6] N N N N 1 1 N N N N 
[7] N N N N 1 N N N N N 
*/echo "</br>------------------------------</br>"; 
+1

チャットでタキをするには、さらに4ポイント必要です。あなたはそれを投票してもらえますか?私はPHPを学んでいるので、その機能が必要です。または、少なくとも私が***になるように投票しないでください。 –

+0

2番目の配列はどのように3つの要素を失いますか?私もその部分を理解していない。 –

+1

'array_map'は一度に1つの配列だけを処理し、他のパラメータはコールバック関数に渡される第2のパラメータです。また、あなたのコールバック関数は 'NULL'ですので、それはすべての値を返します私は驚きです。 – Havenard

答えて

3

誤解はcall_user_func_arrayの誤解に由来します。

だから、あなたはコードを持っている:今、私たちはarray_map manual、たとえばで見ることができ、そう

$transpose = array_map($poles[0], $poles[1], $poles[2], $poles[3] /* all your other poles are passed as arguments here */); 

$transpose = call_user_func_array('array_map', $poles); 

をそれと同じです。 $poles[0]NULLです。最初の引数がNULLであれば、array_mapはちょうど他の配列から同じキーを収集:

// this is a more understandable variant with real values: 
$transpose = array_map(
    NULL, 
    [1, 1, 1, 1, 1], 
    [1, 1, 1], 
    [1], 
    [1, 1, 1], 
    [1, 1, 1, 1, 1, 1, 1, 1], 
    [1, 1, 1, 1, 1, 1, 1], 
    [1, 1, 1, 1], 
    [1], 
    [1], 
    [1, 1, 1] 
); 

ので、

  • 最初の反復:引数配列から[0] -index鍵を取る、それはあなたに与え[1,1,1,1,1,1,1,1,1,1]
  • 2回目の繰り返し:引数配列から[1] -indexキーを取ると、 [1,1,NULL,1,1,1,1,NULL,NULL,1]となります。 NULLが表示されます。これは、引数配列の中にがありません。そのようなインデックスはです。
  • となど

そして、これはあなたの結果を取得する方法です。

+0

ありがとうございます。たとえ私が新しいものであっても、とにかく複雑な例のようです。私はまだこれを理解していません。私は1年ほどの学習の後でこれを調べ、それを "評価"します。情報をありがとう、私は本当にそれに固執しています。今のところ、私はarray_mapがこれらの$ pole [0]、$ pole [1]などに何をするのかを知りません。マニュアルに基づいて、私はそれが "与えられた配列の要素にコールバックを適用する"と考えているでしょう。私の最初の問題は、その「コールバック」が何であるか分からなかったことです。私はこれがNULLだと思いますが、私は理解できません。 –

+0

もう一度、 'call_user_func_array'が何であるかを理解しようとします。 –

+0

私は今それを得ていると思う。例#4と同様、$ d = array_map(null、$ a、$ b、$ c、$ d、$ eなど)と同じシーケンスがあります。 "いずれにしても"、とにかく "奇妙なもの"のように見えます:)この例では、PHPが賢明です。これは相対的に1から10のスケールで比較的難しいでしょうか? –

1

ので、このコード:

$array = [1, 2, 3, 4]; 
$return = call_user_func_array('array_map', $array); 

はこのコードと同じこと:

行う call_user_func_array()
$return = array_map(1, 2, 3, 4); 

今、このコード:

$array1 = [1, 2, 3, 4]; 
$array2 = [5, 6, 7, 8]; 
$return = array_map('callback', $array1, $array2); 

は、このコードと同じいます。do array_map()

$array1 = [1, 2, 3, 4]; 
$array2 = [5, 6, 7, 8]; 
foreach ($array1 as $i => $v) 
    $return[] = callback($array1[$i], $array2[$i]); 

あなたのコールバック関数がNULLなので、array_mapがどのように振る舞うかは不明ですが、この例があなたのコードで何が起こっているのかを知ることを願っています。今はそれが理にかなっていません。

+0

あなたと同じです - マニュアルを参照してください。 –

+0

答えをありがとう。私はこの仕組みがどういうものなのか分かりませんし、私が理解していない部分が何であるかは分かりません。私はこれまで1ヶ月以上PHPを学んできましたので、私は新しいです。私は約5日間これに固執してきました。 –

関連する問題