PHP - 替换子数组中的值

时间:2014-03-25 02:41:04

标签: php replace arrays

我有两个数组$ 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时,值似乎没有变化。 谁能帮助我找出我错过的东西?

3 个答案:

答案 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']];
      }
    }
  }
}

确保在每个迭代级别使用引用。