2014-03-25 108 views
0

我有兩個數組$ pq和$ rs。請看下面:PHP - 替換子數組中的值

$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 $項目的值,它從$打印值RS,但是當我打印整個數組$ PQ,值似乎是不變。 任何人都可以請幫我找出我失蹤的東西嗎?

回答

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不需要通過引用傳遞,因爲您沒有更改該數組中的任何內容。

1

您已將$item作爲參考轉讓給$pages$lines。除非您通過引用指定$pages,否則$pq的實際值不會有任何影響;同樣,$pages的實際值將保持不變,除非您通過引用分配$lines。因此,爲了達到您想要的效果,請將foreach($pq as $pages)更改爲foreach($pq as &$pages)foreach($pages as $lines)foreach($pages as &$lines)

+0

不客氣。我的答案在你接受的答案前111秒,但肯定沒有達到你在那個答案中找到的某些積極屬性。 –

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

確保在迭代的每個級別使用的引用。