如果有这样的php数组:
$arr = array(
array('tree' => array('apple', 'pear', 'quantity' => 1)),
array('house' => array('door', 'window', 'quantity' => 1)),
array('house' => array('door', 'window')), 'quantity' => 1)),
);
我想要实现的是,如果有重复值,数量会增加,重复值会被删除。
任何解决方案?
答案 0 :(得分: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)
}
}
答案 1 :(得分:0)
另一种方法:
$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);