删除mulit维数组中具有相同键的重复值,并将唯一值存储到另一个数组

时间:2015-05-29 06:15:11

标签: php arrays

我有一个数组

Array([0]=>Array
            (
               [a]=>'street1'
               [b]=>'area1'
               [c]=>'zip1'
            )
      [1]=>Array
            (
               [a]=>'street2'
               [b]=>'area1'
               [c]=>'zip1'
            (

      [2]=>Array
            (
               [a]=>'street3'
               [b]=>'area1'
               [c]=>'zip2'
            (
      )

这里我想要做的是,删除相同键的重复值并将剩余的唯一值(如下所示)存储到另一个数组中

Array([a]=>Array('street1','street2','street3')
      [b]=>Array('area1')
      [c]=>Array('zip1','zip2')
      )

我尝试使用数组合并和一些foreach循环这样做,它真的很乱。有人可以帮我解决这个问题。

4 个答案:

答案 0 :(得分:2)

试试这个:

$input = array(
    array('a'=>'street1', 'b'=>'area1', 'c'=>'zip1'),
    array('a'=>'street2', 'b'=>'area1', 'c'=>'zip1'),
    array('a'=>'street3', 'b'=>'area1', 'c'=>'zip2')
);

$result = array();
foreach($input as $address) {
    foreach($address as $field=>$value) {
        if (!isset($result[$field])) $result[$field] = array();
        $result[$field][] = $value;
    }
}

foreach($result as $key=>$values) {
    $result[$key] = array_unique($values);
}

您可以在添加值之前检查是否存在值,而不是之后使用array_unique。根据数据大小,它可以节省内存。

即:

$result = array();
foreach($input as $address) {
    foreach($address as $field=>$value) {
        if (!isset($result[$field])) $result[$field] = array();

        if (!in_array($value, $result[$field])) {
            $result[$field][] = $value;
        }
    }
}

答案 1 :(得分:2)

[akshay@localhost tmp]$ cat test.php
<?php

$array = array( array('a'=>'street1','b'=>'area1','c'=>'zip1'),array('a'=>'street2','b'=>'area1','c'=>'zip1'),array('a'=>'street3','b'=>'area1','c'=>'zip2'));

foreach($array as $v)
{
    foreach($v as $p => $q)
    {
        if(!isset($output[$p]))
        {
            $output[$p][] = $q;
            continue;
        }

        if(!in_array($q,$output[$p]))
            $output[$p][] = $q;
    }
}

// Input
print_r($array);

//Output
print_r($output);
?>

<强> 输出

[akshay@localhost tmp]$ php test.php
Array
(
    [0] => Array
        (
            [a] => street1
            [b] => area1
            [c] => zip1
        )

    [1] => Array
        (
            [a] => street2
            [b] => area1
            [c] => zip1
        )

    [2] => Array
        (
            [a] => street3
            [b] => area1
            [c] => zip2
        )

)
Array
(
    [a] => Array
        (
            [0] => street1
            [1] => street2
            [2] => street3
        )

    [b] => Array
        (
            [0] => area1
        )

    [c] => Array
        (
            [0] => zip1
            [1] => zip2
        )

)

答案 2 :(得分:2)

将此视为输入

$input = [
    ['a' => 'street1', 'b' => 'area1', 'c' => 'zip1'],
    ['a' => 'street2', 'b' => 'area1', 'c' => 'zip1'],
    ['a' => 'street3', 'b' => 'area1', 'c' => 'zip2']
];

使用array_walk()

array_walk($input, function($v) use(&$final){
    array_walk($v, function($val, $key, $v) use(&$final){
        $final[$key][] = $v[$key];
    }, $v);
});

$final = array_map('array_values', array_map('array_unique', $final));

使用foreach

foreach($input as $array)
{
    foreach($array as $key => $val)
    {
        $final[$key][] = $array[$key];
    }
}   unset($array, $key, $val);

$final = array_map('array_values', array_map('array_unique', $final));

两种情况下的$final输出

array (size=3)
  'a' => 
    array (size=3)
      0 => string 'street1' (length=7)
      1 => string 'street2' (length=7)
      2 => string 'street3' (length=7)
  'b' => 
    array (size=1)
      0 => string 'area1' (length=5)
  'c' => 
    array (size=2)
      0 => string 'zip1' (length=4)
      1 => string 'zip2' (length=4)

答案 3 :(得分:1)

$arr = array(
    array('a'=>'street1', 'b'=>'area1', 'c'=>'zip1'),
    array('a'=>'street2', 'b'=>'area1', 'c'=>'zip1'),
    array('a'=>'street3', 'b'=>'area1', 'c'=>'zip2')
);

$new = array();
foreach($arr as $a){

    foreach($a as $key=>$value){
        if(array_key_exists($key,$new)){
            if(!in_array($value,$new[$key])){
            array_push($new[$key],$value);
            }
        }
        else{
            $new[$key][] = $value;
        }
    }
}
var_dump($new);

输出

array(3) {
  ["a"]=>
  array(3) {
    [0]=>
    string(7) "street1"
    [1]=>
    string(7) "street2"
    [2]=>
    string(7) "street3"
  }
  ["b"]=>
  array(1) {
    [0]=>
    string(5) "area1"
  }
  ["c"]=>
  array(2) {
    [0]=>
    string(4) "zip1"
    [1]=>
    string(4) "zip2"
  }
}