数组唯一更改值


Array unique change value

如果有这样的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);