从Array1中的特定行值中减去Array2中的行值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Array1中的特定行值中减去Array2中的行值相关的知识,希望对你有一定的参考价值。
我想从quantity
的$array2
中减去stocks
的$array1
。
$array1= ([product_id]=>4, [stocks]=>20)
$array2= ([product_id]=>4, [quantity]=>3)
So that would be:
$array1= ([0]=> 4, [1] => 20);
$array2= ([0]=> 4, [1] => 3);
然后输出应该是:
$array1= ([0]=> 4, [1] => 17);
您的数组结构与多个记录看起来略有不同,代码以丑陋的方式运行。我假设你在谈论这样的事情:
$array1 = array(
0=>array('product_id'=>4, 'stocks'=>20),
1=>array('product_id'=>5, 'stocks'=>60));
$array2 = array(
0=>array('product_id'=>4, 'quantity'=>3)
1=>array('product_id'=>5, 'quantity'=>30));
...这是一个多维数组(通常用于从数据库中提取的记录)。
foreach($array1 as $key=>$value){
foreach($array2 as $key2=>$value2) {
if($value['product_id']==$value2['product_id']){
$value['stocks'] -= $value2['quantity'];
//optimization to avoid searching this again.
unset($array2[$key]);
}
}}
根据您的要求,以下内容将满足您的要求:
if($array1['product_id'] == $array2['product_id']) {
$array1['stocks'] -= $array2['quantity'];
}
如果你需要循环一个更大的阵列,那么我所提供的只是更大拼图的一部分。
Jesse的答案没有经过测试,也没有提供所需的输出,因为“stock”数组没有被修改 - 数组的副本正在循环中被修改 - 所以如果你试图将结果打印到屏幕上,没有变化。
要通过引用进行修改,请在第一个循环中的值变量之前使用&
。
unset()
键也必须来自内循环才能准确。
另外,如果“sales”“product_id”是唯一的,那么在匹配时打破内部循环将提高性能。 (这就是array_search()
的工作原理。)
代码:(Demo)
$stocks = [
['product_id'=>2, 'stocks'=>50],
['product_id'=>3, 'stocks'=>100],
['product_id'=>4, 'stocks'=>20],
['product_id'=>5, 'stocks'=>60]
];
$sales = [
['product_id'=>4, 'quantity'=>3],
['product_id'=>5, 'quantity'=>30]
];
foreach ($stocks as &$row) { // modify by reference
foreach ($sales as $k => $row2) { // search for product_id match
if ($row['product_id'] == $row2['product_id']) {
$row['stocks'] -= $row2['quantity']; // subtract
unset($sales[$k]); // eliminate match from lookup array
break; // assuming $sales['product_id'] values are unique
}
}
}
var_export($stocks);
输出:
array (
0 =>
array (
'product_id' => 2,
'stocks' => 50,
),
1 =>
array (
'product_id' => 3,
'stocks' => 100,
),
2 =>
array (
'product_id' => 4,
'stocks' => 17,
),
3 =>
array (
'product_id' => 5,
'stocks' => 30,
),
)
或者,您可以将sales数组转换为flattened,product_id-keyed数组以用作查找。
代码:(Demo)
$keyed = array_column($sales, 'quantity', 'product_id');
var_export($keyed);
echo "
---
";
foreach ($stocks as &$row) { // modify by reference
if (isset($keyed[$row['product_id']])) { // search for product_id match
$row['stocks'] -= $keyed[$row['product_id']]; // subtract
}
}
var_export($stocks);
输出:
array (
4 => 3,
5 => 30,
)
---
array (
0 =>
array (
'product_id' => 2,
'stocks' => 50,
),
1 =>
array (
'product_id' => 3,
'stocks' => 100,
),
2 =>
array (
'product_id' => 4,
'stocks' => 17,
),
3 =>
array (
'product_id' => 5,
'stocks' => 30,
),
)
以上是关于从Array1中的特定行值中减去Array2中的行值的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ASP.NET C# 中的 SqlDataSource 获取特定的行值?
Pandas:使用 apply 将特定列中的行值复制到新列中
Powershell:如果array1中的项目包含array2中的项目,我在这里做错了啥
我需要检查 Array1 中的 CHAR 是不是包含我的 Array2 中的一些 CHAR,但我不能将 Contains 用于 CHAR... 如何解决? [关闭]