2015-01-23 2 views
1
<?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.Почему этот php-массив не возвращает ошибку?

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>"; иметь букву «А», возвратившись, но если я типа echo "<p>Letter: {$letters}</p>"; тогда я получаю ошибку.

Мое внимание сосредоточено на линии 13, { echo "<li>$array [$key] = $value"; }

Почему это не возвращает ошибку?

Не указано в '$array', '$key' не было назначено, а в '$value' не указано.

Я только начал изучать PHP & MySQL несколько дней назад. Любая помощь очень ценится, поскольку я пытаюсь научиться и хочу перейти к следующей части этой книги, но мне нужно сначала обдумать это.

~ Спасибо!

+0

'$ key',' $ value' и '$ array' определены в Еогеасп – Class

+0

' $ массива 'определяется во внешнем цикле foreach – xbonez

+0

, вы не можете эха в массиве, поэтому он вызывает ошибку, когда вы выполняете« эхо »

Письмо: {$ letters}

"; ' –

ответ

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

Все эти три переменные являются скалярными значениями (строки или номера), поэтому нет проблем с их печатью.

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

Посмотрите, как работает foreach. Здесь неназванный номер $array будет иметь одно из двух значений: либо "Letter", либо "Number". Очевидно, что оба они могут быть напечатаны без проблем.

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

Здесь $list будет либо array('A', 'B', 'C') или (1, 2, 3). В любом случае $key будет иметь одно из значений: 0, 1 или 2 и $value будет либо строкой, либо целым числом. Опять же, все они могут быть напечатаны без проблем.

1

Прежде всего, это

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

возвращает ошибку, потому что вы пытались повторить весь массив. Это не может быть сделано с эхом.

Этот код

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

справедливо, потому что каждое значение имеет свой ключ. Если вы не определяете ключ для некоторого значения, тогда ключ будет добавлен автоматически. Вы сказали, что вы знаете, что это работает:

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

«0» является ключевым и она была добавлена ​​автоматически при инициализации массива. Ключ не обязательно должен быть строкой, чтобы быть ключом для некоторого значения.

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' 

*/ 
Смежные вопросы