在 PHP 的 foreach 循环中增加数组元素?

6

Consider the code below:

<?php
$arr = array();
$arr['b'] = 'book';
foreach($arr as $key=>$val) {
   print "key=>$key\n";
   if(!isset($arr['a']))
      $arr['a'] = 'apple';
}
?>

它没有显示 'a'。如何使用哈希表(数组)遍历每个元素,以及foreach的工作原理。如果列表已经实现,为什么不能在运行时添加更多内容?

请不要告诉我可以通过计数来使用基于数字索引完成此任务。


它没有显示“a”,你是什么意思? - j0k
无法重现 - Rikesh
@Rikesh:请在此处找到它(http://ideone.com/1qkleX)。 - Tarun Chabarwal
@Rikesh 请查看标准输出部分。 - Tarun Chabarwal
6个回答

3

Foreach在循环之前复制数组的结构(了解更多),因此您不能更改数组的结构并等待循环内的新元素。您可以使用while而不是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';
}

0

0

我认为你需要连续存储数组元素

尝试一下

<?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);
?>

-1

试试这个:

你会得到数值。

<?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
)

请接受,这样其他人就可以从中得到帮助... - Anand Solanki
你读了问题吗?问题是:在循环期间为什么添加新键没有效果(而不是如何输出数组)? - Alma Do
请再次阅读问题 - Tarun Chabarwal

-1
如果您想检查数组中是否存在某个键,请使用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);

你不需要检查 even,尝试移除 isset 检查然后运行。 - Tarun Chabarwal

-1

使用for循环和实时的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';
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接