2015-05-29 61 views
2

我有一个数组除去具有相同的密钥重复值和独特的值存储到另一个阵列

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循环这样做的,它真的得到了混乱。有人能帮我解决这个问题吗?

回答

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; 
     } 
    } 
} 
2
[[email protected] 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); 
?> 

输出

[[email protected] 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 
     ) 

) 
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" 
    } 
} 
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) 
相关问题