Рассмотрим следующий код:
<?php $arr = array(); $arr['b'] = 'book'; foreach($arr as $key=>$val) { print "key=>$key\n"; if(!isset($arr['a'])) $arr['a'] = 'apple'; } ?>
Он не отображает 'a'. Как foreach работает с хэш-таблицей (массивом), чтобы пересечь каждый элемент. Если списки реализуются, почему я не могу добавить больше во время выполнения?
Пожалуйста, не говорите мне, что я мог бы выполнить эту задачу с числовым индексом с помощью подсчета.
Foreach копирует структуру массива перед циклом (далее), поэтому вы не можете изменять структуру массива и ждать новых элементов внутри цикла. Вместо этого вы можете использовать foreach
.
$arr = array(); $arr['b'] = 'book'; reset($arr); while ($val = current($arr)) { print "key=".key($arr).PHP_EOL; if (!isset($arr['a'])) $arr['a'] = 'apple'; next($arr); }
Или используйте ArrayIterator
с foreach, потому что ArrayIterator не является массивом.
$arr = array(); $arr['b'] = 'book'; $array_iterator = new ArrayIterator($arr); foreach($array_iterator as $key=>$val) { print "key=>$key\n"; if(!isset($array_iterator['a'])) $array_iterator['a'] = 'apple'; }
Я думаю, вам нужно сохранить элемент массива
Пытаться
<?php $arr = array(); $arr['b'] = 'book'; foreach($arr as $key=>$val) { print "key=>$key\n"; if(!isset($arr['a'])) $arr['a'][] = 'apple'; } print_r($arr); ?>
Чтобы иметь возможность напрямую изменять элементы массива в цикле, перед значением $ value нужно указать &. В этом случае значение будет присвоено по ссылке.
Попробуй это:
Вы получите значения.
<?php $arr = array(); $arr['b'] = 'book'; foreach($arr as $key=>$val) { print "key=>$key\n"; if(!isset($arr['a'])) $arr['a'] = 'apple'; } echo '<pre>'; print_r($arr); ?>
Вывод:
key=>b <pre>Array ( [b] => book [a] => apple )
Если вы хотите проверить наличие ключа или нет в массиве, используйте функцию array_key_exists
Например:
<?php $arr = array(); $arr['b'] = 'book'; print_r($arr); // prints Array ( [b] => book ) if(!array_key_exists("a",$arr)) $arr['a'] = 'apple'; print_r($arr); // prints Array ( [b] => book [a] => apple ) ?>
Если вы хотите использовать условие isset
попробуйте вот так:
$arr = array(); $arr['b'] = 'book'; $flag = 0; foreach($arr as $key=>$val) { print "key=>$key\n"; if(!isset($arr["a"])) { $flag = 1; } } if(flag) { $arr['a'] = 'apple'; } print_r($arr);
Как насчет использования for и realtime array_keys ()?
<?php $arr = array(); $arr['b'] = 'book'; for ($x=0;$x<count($arr); $x++) { $keys = array_keys($arr); $key = $keys[$x]; print "key=>$key\n"; if(!isset($arr['a'])) $arr['a'] = 'apple'; }