为什么这个php数组没有返回错误?

时间:2015-01-23 21:52:28

标签: php arrays loops matrix foreach

<?php

$letters = array( 'A', 'B', 'C' );
$numbers = array( 1, 2, 3 );
$matrix = array( 'Letter' => $letters, 'Number' => $numbers );

echo "<p>Start : {$matrix['Letter'][0]}</p>";

foreach($matrix as $array => $list)
{
   echo'<ul>';
   foreach($list as $key => $value)
   { 
      echo "<li>$array [$key] = $value";
   }
   echo '</ul>';
}

?>

我需要帮助理解这段代码,基本上我很困惑#13行如何工作。

What I see:

'$value' = non-key values of '$list'
'$list' = non-key values of '$matrix'
'$matrix' = $letters, $numbers

Therefore '$value' = $letters, $numbers

'$array' = key values of '$list'

Therefore '$array' = 'Letter', 'Number'

我知道我可以输入echo "<p>Letter: {$letters[0]}</p>";来填写字母&#39; A&#39;返回,但如果我输入echo "<p>Letter: {$letters}</p>";,我将收到错误。

我的重点是第13行,{ echo "<li>$array [$key] = $value"; }

为什么这不会返回错误?

未指定'$array'中的任何地点,从未分配'$key',且未指定'$value'中的地点。

我刚开始学习PHP&amp; MySQL前几天。 任何帮助都非常受欢迎,因为我正在努力学习并希望继续阅读本书的下一部分,但我需要首先了解这一点。

〜谢谢!

5 个答案:

答案 0 :(得分:1)

这三个变量都是foreach构造为循环体临时定义的变量,每个变量都是数字或字符串,而不是数组。

http://php.net/manual/en/control-structures.foreach.php

foreach($matrix as $array => $list)

上面的行定义了该循环体的变量$array$list; $array是一个字符串,依次设置为$matrix的每个键; $list是每个密钥的对应值。

foreach($list as $key => $value)

同样,这定义了循环体内的变量$key$value; $key一次设置为$list的每个键,$value设置为每个匹配值。

答案 1 :(得分:1)

所有这三个变量都是标量值(字符串或数字),因此直接打印它们没有问题。

foreach($matrix as $array => $list)

了解foreach的工作原理。这里名称不详的$array将具有以下两个值之一:"Letter""Number"。显然,它们都可以毫无问题地打印出来。

foreach($list as $key => $value)

此处$list可以是array( 'A', 'B', 'C' )( 1, 2, 3 )。在任何一种情况下,$key都会有一个值012,而$value将是字符串或整数。同样,所有这些都可以毫无问题地打印出来。

答案 2 :(得分:1)

foreach($matrix as $array => $list)
{
    //$array is String "Letter" and $list is array $letters for first iteration
    //$array is String "Number" and $list is array $numbers for second iteration

    echo'<ul>';
    foreach($list as $key => $value)
    {
       //when $list=$letters 
       //1st iteration:$key =0 and value 'A'; 2nd iteration :$key=1 and $value= 'B'.....

      //finally
      //$array means "Letter"
      //$key mean 0
      //$value  mean "A"

      //and loop goes on


        echo "<li>$array [$key] = $value";
         //result
         //<li>Letter[0] = A;
         //<li>Letter[1] = B;  
         //.............
    }
    echo '</ul>';
}

希望你理解。
请记住,您的li标签未关闭。请使用此

echo "<li>$array [$key] = $value </li>";

答案 3 :(得分:1)

首先这个

echo "<p>Letter: {$letters}</p>";

返回错误,因为您尝试回显整个数组。它不能用echo做。

此代码

foreach($list as $key => $value)
{ echo "<li>$array [$key] = $value"; }
echo '</ul>';
}

是有效的,因为每个值都有自己的密钥。如果您没有为某个值定义键,则会自动添加该键。 你说你知道这有效:

echo "<p>Letter: {$letters[0]}</p>";

“0”是键,它在阵列初始化期间自动添加。键不需要是字符串就可以成为某个值的键。

答案 4 :(得分:0)

我错过了这样一个事实,即如果没有为'$letters''$numbers'设置关键值,则默认情况下,每个值的键都是其顺序。

因此,通过每个循环,我意识到$list[0] = $letters$list[1] = $numbers

Therefore:
'$value' = non key value of '$list[0]' = non-key value of '$letters'
'$key' = key value of '$list[0]' = key value of '$letters'

从某种意义上说,'$list'分别指向'$letters''$numbers'

如果将来有人感到困惑,我已经完成了以下每次迭代:

/*

Loop One:
Sub1:
$list[0] = $letters = 'A', 'B', 'C'
$key = '0'
$value = 'A'

Sub2:
$list[0] = $letters = 'A', 'B', 'C'
$key = '1'
$value = 'B'

Sub3:
$list[0] = $letters = 'A', 'B', 'C'
$key = '2'
$value = 'C'

Loop Two:
Sub1:
$list[1] = $numbers = '1', '2', '3'
$key = '0'
$value = '1'

Sub2:
$list[1] = $numbers = '1', '2', '3'
$key = '1'
$value = '2'

Sub3:
$list[1] = $numbers = '1', '2', '3'
$key = '2'
$value = '3'

*/