2016-01-13 142 views
0

我想比較的價值和關鍵嵌套的多維數組,所以我的情況是:比較嵌套多維數組

我需要比較兩個嵌套的多維數組,並找到數量在他們的價值觀方面的差異,更新這些量,而且還包括新的數組中的項,而不是舊的,例如:

,如果我有以下數據:

第一個數組:

Array (
    [0] => Array ([name] => hey [qty] => 3) 
    [1] => Array ([name] => hello [qty] => 1) 
    [2] => Array ([name] => test [qty] => 1) 
) 

而且具有以下值的另一個嵌套多維數組:

第二個數組:

Array (
    [0] => Array ([name] => hey [qty] => 5) 
    [1] => Array ([name] => hello [qty] => 5) 
    [2] => Array ([name] => PHP [qty] => 2) 
) 

我想只有在第二陣列和更新的新項目,通過鍵實現以下輸出它們的值基於第一和第二陣列項目的數量之間的差異,即:

期望的輸出

Array (
    [0] => Array ([name] => hey [qty] => 2) 
    [1] => Array ([name] => hello [qty] => 4) 
    [2] => Array ([name] => PHP [qty] => 2) 
) 

我使用以下方法產生了差異,但請注意如何不添加PHP。我不太清楚如何在不添加它的情況下在我的內循環中檢查它。

<?php 

$items = [ 
    'hey', 
    'hey', 
    'hey', 
    'hello', 
    'test' 
]; 

$arr = array_count_values($items); 



$oldItems = array(); 
foreach ($arr as $name => $qty) { 
    $oldItems[] = compact('name', 'qty'); 
} 



$newItems = [ 
    ['name' => 'hey', 'qty' => 5], 
    ['name' => 'hello', 'qty'=> 5], 
    ['name' => 'PHP', 'qty' => 2] 
]; 


$diff = []; 

foreach($newItems as $newItem) { 
    foreach($oldItems as $oldItem) { 
     if ($newItem['name'] == $oldItem['name']) { 
     //get quantity 
      $qtyDiff = $newItem['qty'] - $oldItem['qty']; 
      if ($qtyDiff > 0) { 
      $diff[$newItem['name']] = $qtyDiff; 
      } 
     } 
    } 
} 

print_r($diff); die(); 

從這個腳本電流輸出如下:

Array (
    [0] => Array ([name] => hey [qty] => 2) 
    [1] => Array ([name] => hello [qty] => 4) 
) 

任何幫助表示讚賞或改進意見。謝謝!

+0

有你考慮使用['array_diff()'](http://php.net/manual/en/function.array-diff.php)? –

+0

我肯定會對使用PHP內置數組函數感興趣,但在使用嵌套多維數組時不能100%確定如何實現它們,並且不可能將它們壓平(在我的用法中)。 – liamjnorman

+0

文檔中有一個完整的示例。 –

回答

1

只需要一個foreach

<?php                                                    

$oldItems = [                                                  
    ['name' => 'hey', 'qty' => 3],                                             
    ['name' => 'hello', 'qty'=> 1],                                             
    ['name' => 'test', 'qty' => 1]                                             
];                                                     

$newItems = [                                                  
    ['name' => 'hey', 'qty' => 5],                                             
    ['name' => 'hello', 'qty'=> 5],                                             
    ['name' => 'PHP', 'qty' => 2]                                             
];                                                     

$diff = array();                                                 
foreach ($oldItems as $id => $oldRow) {                                            
    $newRow = $newItems[$id];                                              
    if ($newRow['name'] == $oldRow['name']) {                                          
     $diff[] = array(                                               
      'name' => $oldRow['name'],                                            
      'qty' => $newRow['qty'] - $oldRow['qty']                                        
     );                                                   
    } else {                                                  
     $diff[] = $newItems[$id];                                             
    }                                                    
}                                                     

print_r($diff); 

輸出:

Array 
(
    [0] => Array 
     (
      [name] => hey 
      [qty] => 2 
     ) 

    [1] => Array 
     (
      [name] => hello 
      [qty] => 4 
     ) 

    [2] => Array 
     (
      [name] => PHP 
      [qty] => 2 
     ) 

) 

如果訂單或新老項目大小不同,則使用以下命令:

<?php                                                    

$oldItems = [                                                  
    ['name' => 'hey', 'qty' => 3],                                             
    ['name' => 'hello', 'qty'=> 1],                                             
    ['name' => 'test', 'qty' => 1]                                             
];                                                     

$newItems = [                                                  
    ['name' => 'hey', 'qty' => 5],                                             
    ['name' => 'hello', 'qty'=> 5],                                             
    ['name' => 'PHP', 'qty' => 2]                                             
];                                                     
$name2newItem = array();                                               
foreach ($newItems as $item) {                                              
    $name2newItem[$item['name']] = $item;                                           
}                                                     

$diff = array();                                                 
foreach ($oldItems as $id => $oldRow) {                                            
    $name = $oldRow['name'];                                              
    if (isset($name2newItem[$name])) {                                            
     $newRow = $name2newItem[$name];                                            
     $diff[$name] = array(                                              
      'name' => $name,                                              
      'qty' => $newRow['qty'] - $oldRow['qty']                                        
     );                                                   
    }                                                    
}                                                     
foreach ($name2newItem as $name => $item) {                                           
    if (!isset($diff[$name])) {                                              
     $diff[$name] = $item;                                              
    }                                                    
}                                                     
$diff = array_values($diff);                                              

print_r($diff); 
+0

這非常完美,我看到我的原始代碼中的錯誤。非常感謝 – liamjnorman

+0

需要注意的一件事是,如果順序不準確,那麼數組不會總是正確計算差異,有沒有辦法解決這個問題? – liamjnorman

+1

當然,看到更新的答案。只需要一個額外的查找數組'name2newItem' – Fabricator