我有两个数组$ pq和$ rs。请看下面的内容:
$pq = array ('page-0'=>array ('line-0'=>array('item-0'=>array('name'=>"item-00",'value'=>"123"),
'item-1'=>array('name'=>"item-01",'value'=>"456")
),
'line-1'=>array('item-0'=>array('name'=>"item-10",'value'=>"789"),
'item-1'=>array('name'=>"item-11",'value'=>"012")
)),
'page-1'=>array ('line-0'=>array('item-0'=>array('name'=>"item-100",'value'=>"345"),
'item-1'=>array('name'=>"item-101",'value'=>"678")
),
'line-1'=>array('item-0'=>array('name'=>"item-110",'value'=>"901"),
'item-1'=>array('name'=>"item-111",'value'=>"234")
),
'line-2'=>array('item-0'=>array('name'=>"item-210",'value'=>"567"),
'item-1'=>array('name'=>"item-211",'value'=>"890")
))
);
$rs = array ('1'=>array('name'=>'item-00', 'value'=>"abc"),
'2'=>array('name'=>'item-01', 'value'=>"def"),
'3'=>array('name'=>'item-10', 'value'=>"ghi"),
'4'=>array('name'=>'item-11', 'value'=>"jkl"),
'5'=>array('name'=>'item-100', 'value'=>"mno"),
'6'=>array('name'=>'item-101', 'value'=>"pqr"),
'7'=>array('name'=>'item-110', 'value'=>"stu"),
'8'=>array('name'=>'item-111', 'value'=>"vwx")
);
我要做的是用$ rs中的值替换$ pq中的值。 例如$ pa中的item-01将被$ rs替换为abc。 我试过的是:
foreach($rs as &$rs1) {
echo "first count :".$firstCount."<br>";
foreach($pq as $pages) {
foreach($pages as $lines) {
foreach($lines as &$item) {
if ($item['name'] == $rs1['name']) { echo "matching </p>";
$item['value']=$rs1['value'];
echo '<pre>';
print_r($item);
echo '</pre>';
echo "<hr>";
}
}
}
}
}
当我从$ pq打印$ item的值时,它会打印$ rs中的值,但是当我打印整个数组$ pq时,值似乎没有变化。 谁能帮助我找出我错过的东西?
答案 0 :(得分:1)
您已通过引用分配了$item
但未对$pages
和$lines
执行相同操作。除非您通过引用分配$pq
,否则对$pages
的实际值不会产生任何影响;同样,除非您通过引用分配$pages
,否则$lines
的实际值将保持不变。因此,为了实现您的目标,请将foreach($pq as $pages)
更改为foreach($pq as &$pages)
,将foreach($pages as $lines)
更改为foreach($pages as &$lines)
。
答案 1 :(得分:1)
您通过引用正确循环遍历每行中的项目,但您不会为行或页面本身执行此操作。因此,您需要更新该行的副本中项目的值,而不是行本身。它应该是:
foreach($rs as $rs1) {
echo "first count :".$firstCount."<br>";
foreach($pq as &$pages) {
foreach($pages as &$lines) {
foreach($lines as &$item) {
if ($item['name'] == $rs1['name']) { echo "matching </p>";
$item['value']=$rs1['value'];
echo '<pre>';
print_r($item);
echo '</pre>';
echo "<hr>";
}
}
}
}
}
请注意&
和&$lines
前面的&$pages
。另请注意,$rs1
不需要通过引用传递,因为您不会更改该数组中的任何内容。
答案 2 :(得分:1)
您可以先构建搜索数组,以便更轻松地匹配项目:
$search = array_reduce($rs, function(&$prev, $current) {
$prev[$current['name']] = $current;
return $prev;
}, []);
这将创建另一个数组,项目名称为键。然后,迭代$pq
中的每个项目并在必要时修改叶子:
foreach ($pq as &$page_data) {
foreach ($page_data as &$line_data) {
foreach ($line_data as &$item_data) {
if (isset($search[$item_data['name']])) {
$item_data = $search[$item_data['name']];
}
}
}
}
确保在每个迭代级别使用引用。