比较嵌套的多维数组

时间:2016-01-13 18:37:23

标签: php arrays multidimensional-array

我试图按值和键比较嵌套的多维数组,所以我的场景是:

我需要比较两个嵌套的多维数组,并根据数量找出它们的值的差异,并更新这些数量,但也包括新数组中的项目,而不是旧数组中的项目,例如:

如果我有以下数据:

First Array:

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。我不太确定如何在我的内部for循环中检查它而不添加它。

<?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 )
)  

感谢任何帮助或对改进提出反馈意见。谢谢!

1 个答案:

答案 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);
相关问题