2016-01-13 6 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

Смежные вопросы