我正在尝试在foreach
循环内动态编辑数组。我基本上分析了每个键,如果这个键匹配我想要的键,我想在这个之后立即在数组中添加另一个条目。
如果我使用此代码,
$values = array(
'foo' => 10,
'bar' => 20,
'baz' => 30
);
foreach($values as $key => $value){
print $value . ' ';
if($key == 'bar'){
$values['qux'] = 21;
}
}
我有2个问题,
10 20 30
,而不是预期的10 20 30 21
如何在qux
和bar
之间添加baz
条目?
感谢您的想法。
答案 0 :(得分:13)
在循环内部,Foreach不会循环添加到数组中的新值。
如果要在两个现有值之间添加新值,可以使用第二个数组:
$values = array(
'foo' => 10,
'bar' => 20,
'baz' => 30
);
$newValues = array();
foreach($values as $key => $value)
{
$newValues[$key] = $value;
if($key == 'bar')
{
$newValues['qux'] = 21;
}
}
print implode(' ', $newValue);
另外,请参阅StackOverflow讨论foreach循环的一个我最喜欢的问题:How does PHP 'foreach' actually work?
答案 1 :(得分:2)
为此你需要创建一个新数组,
<?php
$values = array(
'foo' => 10,
'bar' => 20,
'baz' => 30
);
$newarray = array();
foreach($values as $k => $v)
{
$newarray[$k] = $v;
if($k == 'bar')
$newarray['qux'] = 21;
}
echo implode(' ', $newarray);
<强>演示:强>
http://3v4l.org/N4XgB
答案 2 :(得分:2)
您可以在值之前使用&符号。
//populate all the promos into their promoG groups
foreach($unclaimedPromoGroups as &$unclaimedPromoGroup) {
$_promo = new Promo();
$_promo->promoGroupID = $unclaimedPromoGroup['promo_groupID'];
$promo = $_promo->getGroupPromos();
$unclaimedPromoGroup["promos"] = $promo;
}
答案 3 :(得分:1)
下面的解决方案使用相同的数组。
$values = array(
'foo' => 10,
'bar' => 20,
'baz' => 30
);
function match($niddle, $haystack, $push, $offset = 0) {
foreach(array_slice($haystack, $offset) as $key => $value)
{
print $value . ' ';
if($key == $niddle)
{
$i = array_search($niddle, array_keys($haystack)) + 1;
$haystack = array_slice($haystack, 0, $i, true) + $push + array_slice($haystack, $i, count($haystack) - $i, true);
$haystack = match($niddle, $haystack, $push, $i);
break;
}
}
return $haystack;
}
$values = match('bar', $values, array('qux'=>21));
var_dump($values);