Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何按键比较两个关联数组_Php_Arrays_Associative Array - Fatal编程技术网

Php 如何按键比较两个关联数组

Php 如何按键比较两个关联数组,php,arrays,associative-array,Php,Arrays,Associative Array,我试图比较两个关联数组,并根据值和键获得差异。我尝试过使用带有闭包的数组过滤器 这两个阵列如下所示: 阵列1 $newArr = [ 0 => [ 'id' => 'UT5', 'qty' => '4' ], 1 => [ 'id' => 'WRO', 'qty' => '3' ], 2 => [ 'id' => 'SHO',

我试图比较两个关联数组,并根据值和键获得差异。我尝试过使用带有闭包的数组过滤器

这两个阵列如下所示:

阵列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)
} 
array(2) { 
    ["UT5"]=> int(2) 
    ["SHO"]=> int(2) 
}
我已经走了这么远:

<?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();
请注意,缺少WRO。有没有一种方法,我可以添加一个条件,以准确地检查这一点?我已经尝试了一些解决方案,例如!in_数组和else都没有提供所需的输出


感谢您的帮助!谢谢

这很简单,只有在两个数组中都存在密钥时,代码才会保存一个值。只需添加一个子句来检查旧数组中是否不存在密钥。(如果旧数组有一个键而新数组没有,也要执行相反的操作)

你的程序结构是为计算机优化的,太复杂了,作为一个人,我完全重写了它

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

这很简单,只有在两个数组中都存在密钥时,代码才会保存一个值。只需添加一个子句来检查旧数组中是否不存在密钥。(如果旧数组有一个键而新数组没有,也要执行相反的操作)

你的程序结构是为计算机优化的,太复杂了,作为一个人,我完全重写了它

<?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 );
一次成功

$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);
一次成功

$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);

如果(!array_key_存在($item['id'],$oldArr)){$toAdd[$item['id']]=$item['qty'];}我尝试过添加其他,如果(!array_key_存在($item['id'],$oldArr)){$toAdd[$item['id']]]=$item['qty'];}我尝试过添加其他,谢谢!我明白你的逻辑,但是我已经对闭包做了如下修改:
else如果(!isset($oldArr[$item['id']]){$toAdd[$item['id']]=$item['qty'];}}});}和我的输出仍然不正确(注意SHO的值应该是int(2))而不是“3”:
array(3){[“UT5”]=>int(2)[“WRO”]=>string(1)“3”[“SHO”]=>string(1)“3”}
谢谢!我明白你的逻辑,但是我已经对闭包做了如下修改:
else如果(!isset($oldArr[$item['id']]){$toAdd[$item['id']]=$item['qty'];}}});}和我的输出仍然不正确(注意SHO的值应该是int(2)),而不是“3”:
array(3){[“UT5”]=>int(2)[“WRO”]=>string(1)“3”[“SHO”]=>string(1)“3”}