我试图按值和键比较嵌套的多维数组,所以我的场景是:
我需要比较两个嵌套的多维数组,并根据数量找出它们的值的差异,并更新这些数量,但也包括新数组中的项目,而不是旧数组中的项目,例如:
如果我有以下数据:
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 )
)
感谢任何帮助或对改进提出反馈意见。谢谢!
答案 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);