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

Why is this php array not returning an error?

<?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>"; 来返回字母 'A',但是如果我输入 echo "<p>Letter: {$letters}</p>";,那么我会收到一个错误。

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

为什么不返回错误?

未指定 '$array' 中的位置,从未分配 '$key',并且未指定 '$value' 中的位置。

我几天前才开始学习PHP & MySQL。 非常感谢任何帮助,因为我正在努力学习并想继续阅读本书的下一部分,但我需要先了解这一点。

~谢谢!

所有这三个变量都是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 设置为每个匹配值。

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

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 将是字符串或整数。同样,所有这些都可以毫无问题地打印出来。

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 标签不是 closed.Use this

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

首先这个

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

returns 错误,因为您试图回显整个数组。用echo是做不到的。

此代码

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

有效,因为每个值都有自己的键。如果您没有为某个值定义键,那么该键将自动添加。 你说你知道这行得通:

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

"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'

*/