数组唯一的更改值

时间:2015-01-10 17:22:49

标签: php arrays

如果有这样的php数组:

$arr = array(
    array('tree' => array('apple', 'pear', 'quantity' => 1)),
    array('house' => array('door', 'window', 'quantity' => 1)),
    array('house' => array('door', 'window')), 'quantity' => 1)),
);

我想要实现的是,如果有重复值,数量会增加,重复值会被删除。

任何解决方案?

2 个答案:

答案 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);