如果有这样的php数组:
$arr = array(
array('tree' => array('apple', 'pear', 'quantity' => 1)),
array('house' => array('door', 'window', 'quantity' => 1)),
array('house' => array('door', 'window')), 'quantity' => 1)),
);
我想要实现的是,如果存在重复值,则数量会增加,重复值将被删除。
有人有解决方案吗?
你可以先看看array_reduce
。下面是一个可以帮助您入门的示例代码。由于您尚未完全描述预期的输出,因此下面的代码仅演示了我可以从中得出的内容。
注意:我可以在数据结构中看到很多边缘情况。比如:如果第一个数组元素有多个条目怎么办?在这种情况下,您将如何组合它?
<?php
$arr = array(
array('tree' => array('apple', 'pear', 'quantity' => 1)),
array('house' => array('door', 'window', 'quantity' => 1)),
array('house' => array('door', 'window', 'quantity' => 1)),
);
$res = array_reduce($arr, function($state, $item){
foreach($item as $key => $value) {
if (isset($state[$key])) {
$state[$key]['quantity']++;
} else {
$state[$key] = $value;
}
}
return $state;
});
var_dump($res)
?>
输出:
array(2) {
["tree"]=> array(3) {
[0]=> string(5) "apple"
[1]=> string(4) "pear"
["quantity"]=> int(1)
}
["house"]=> array(3) {
[0]=> string(4) "door"
[1]=> string(6) "window"
["quantity"]=> int(2)
}
}
另一种方法:
$res2 = array();
foreach ($arr as $n) {
$key = key($n);
(!isset($res2[$key])) ?
$res2[$key] = $n[$key] :
$res2[$key]["quantity"] += $n[$key]["quantity"];
}
print_r($res2);
更新
它应该可以满足新要求:
$new_array = array();
foreach ($arr as $key => $value) {
$new_array[$key] = json_encode($value);// Transform to string to be able to use array_count_values
}
$res = array();
$repeated = array_count_values($new_array);
foreach ($repeated as $val => $c) {
$key = array_search($val, $new_array);// It will find the first one.
$res[$key] = $arr[$key];
$res[$key]["quantity"] = $c;
}
print_r($res);