繁体   English   中英

如何通过键比较两个关联数组

[英]How to compare two associative arrays by key

我正在尝试比较两个关联数组,并根据值和键来获得差值。 我尝试过使用带有闭包的array_filter

这两个数组是这样的:

阵列1

$newArr = [
    0 => [
        'id' => 'UT5',
        'qty' => '4'
    ],
    1 => [
        'id' => 'WRO',
        'qty' => '3'
    ],
    2 => [
        'id' => 'SHO',
        'qty' => '3' 
    ]
];

阵列2

$oldArr = [
    0 => [
        'id' => 'SHO',
        'qty' => '1'
    ],
    1 => [
        'id' => 'UT5',
        'qty' => '2'
    ],
];

我想要的输出如下:

array(3) 
{ 
  ["UT5"]=> int(2) 
  ["SHO"]=> int(2) 
  ["WRO"]=> int(3)
} 

我到现在为止:

<?php

$newArr = [
    0 => [
        'id' => 'UT5',
        'qty' => '4'
         ],
    1 => [
        'id' => 'WRO',
        'qty' => '3'
    ],
    2 => [
        'id' => 'SHO',
        'qty' => '3'
    ]
];

$oldArr = [
    0 => [
        'id' => 'SHO',
        'qty' => '1'
    ],
    1 => [
        'id' => 'UT5',
        'qty' => '2'
    ],
];

$toAdd = [];
foreach ($newArr as $item) {
    $itemsToAdd = array_walk($oldArr, function ($k) use ($item, &$toAdd) {
        if ($k['id'] == $item['id']) {
            $toAdd[$k['id']] = max($k['qty'], $item['qty']) - min($k['qty'], $item['qty']);
        }
    });
}

var_dump($toAdd); die();

但是,使用此功能,我当前的输出是:

array(2) { 
    ["UT5"]=> int(2) 
    ["SHO"]=> int(2) 
}

请注意,缺少WRO。 有没有办法我可以添加一个条件来准确地检查这一点? 我尝试了一些解决方案,例如!in_array,其他都没有给我想要的输出。

任何帮助表示赞赏! 谢谢!

这很简单,只有两个数组中都存在键时,您的代码才保存一个值。 只需添加一个子句以检查键是否在旧数组中不存在。 (如果旧数组有一个新数组没有的键,也可以做相反的操作)

if (!isset(old array [ new array key ]){
$newArray[new array key] = new array key and values;

您的程序结构已针对计算机进行了优化,太复杂而无法作为人类遵循,我将其完全重写。

<?php
$newArr = [0 => ['id' => 'UT5', 'qty' => '4'], 1 => ['id' => 'WRO', 'qty' => '3'], 2 => ['id' => 'SHO', 'qty' => '3']];

$oldArr = [0 => ['id' => 'SHO', 'qty' => '1'], 1 => ['id' => 'UT5', 'qty' => '2'], ];

$newReset = [];
foreach( $newArr as $item ) {
    $newReset[$item['id']] = $item['qty'];
}

$oldReset = [];
foreach( $oldArr as $item ) {
    $oldReset[$item['id']] = $item['qty'];
}

foreach( $newReset as $key => $val ) {
    if( isset( $oldReset[$key] ) ) {
        $toAdd[$key] = max( $oldReset[$key], $val ) - min( $oldReset[$key], $val );
    }
    else $toAdd[$key] = intval($val);
}

var_dump( $toAdd );

这就是结果。

array(3) {
      ["UT5"]=>
      int(2)
      ["WRO"]=>
      int(3)
      ["SHO"]=>
      int(2)
    }

一口气完成

$toAdd = [];
foreach ($newArr as $item) 
   $toAdd[$item['id']] = $item['qty'];
foreach ($oldArr as $item) 
   if (isset($toAdd[$item['id']])) 
       $toAdd[$item['id']] = abs($toAdd[$item['id']] - $item['qty']);
   else 
       $toAdd[$item['id']] = abs($item['qty']);
print_r($toAdd);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM