2015-02-23 88 views
0

我想仅通过值以去除从输入阵列重复user_idPHP - 阵列由值独特在多维数组

输入数组:

array (size=3) 
    0 => 
    array (size=3) 
     'user_id' => string '3' (length=1) 
     'rate' => string '0' (length=1) 
     'note' => string 'a' (length=1) 
    1 => 
    array (size=3) 
     'user_id' => string '3' (length=1) 
     'rate' => string '2' (length=1) 
     'note' => string 'b' (length=1) 
    2 => 
    array (size=3) 
     'user_id' => string '4' (length=1) 
     'rate' => string '3' (length=1) 
     'note' => string 'c' (length=1) 

输出:

array (size=3) 
    0 => 
    array (size=3) 
     'user_id' => string '3' (length=1) 
     'rate' => string '0' (length=1) 
     'note' => string 'a' (length=1) 
    1 => 
    array (size=3) 
     'user_id' => string '4' (length=1) 
     'rate' => string '3' (length=1) 
     'note' => string 'c' (length=1) 

到目前为止:

$result1 = array_unique($inputArray, SORT_REGULAR); 
$result2 = array_map("unserialize", array_unique(array_map("serialize", $inputArray))); 
+0

的可能重复(http://stackoverflow.com/questions/307674/how-to-remove-duplicate-values-from- [如何从在PHP多维数组中删除重复的值] a-multi-dimensional-array-in-php) – Rizier123 2015-02-23 10:11:10

+0

@ Rizier123该职位是由整个数组排序,这是只有价值在数组 – 2015-02-23 10:12:24

+0

@ Rizier123不,这是不是他想删除重复只有身份证。 – 2015-02-23 10:12:49

回答

2

这应该为你工作:

<?php 

    $arr = array(
      array(
       'user_id' => '3', 
       'rate' => '0', 
       'note' => 'a' 
      ), 
      array(
       'user_id' => '3', 
       'rate' => '2', 
       'note' => 'b' 
      ), 
      array(
       'user_id' => '4', 
       'rate' => '3', 
       'note' => 'c' 
      ) 
     ); 

    $tmp = array(); 

    foreach($arr as $key => $innerArray) { 
     if(in_array($innerArray["user_id"], $tmp)) 
      unset($arr[$key]); 
     else 
      $tmp[] = $innerArray["user_id"]; 
    } 

    print_r($arr); 

?> 

编辑:

如果你想要一个更fancyer版本:

$tmp = array(); 
$result = array(); 

$result = array_values(array_filter(array_map(function($innerArray)use(&$tmp){ 
    if(!in_array($innerArray["user_id"], $tmp)) { 
     $tmp[] = $innerArray["user_id"]; 
     return $innerArray; 
    } 
}, $arr))); 

print_r($result); 
+1

未设置不需要,对不对?在其他语言中,如果在循环数组的同时取消设置数组中的某个键,可能会发生不良事情。保证行为在PHP中是正确的? – Sumurai8 2015-02-23 10:22:24

+0

@ Sumurai8在这里它不会产生任何问题 – Rizier123 2015-02-23 10:23:49

0

试试这个:

$ result = array();

foreach($yourArray as $innerArray) { 
     if(in_array($innerArray["user_id"], $result)){ 
      continue; 
      } 
      $result[] = $innerArray; 
    } 

    print_r($result); 
2

如果你正在运行PHP> = 5.6,则下面的工作:

$data = [ 
    [ 
     'user_id' => '3', 
     'rate' => '0', 
     'note' => 'a', 
    ], 
    [ 
     'user_id' => '3', 
     'rate' => '2', 
     'note' => 'b', 
    ], 
    [ 
     'user_id' => '4', 
     'rate' => '3', 
     'note' => 'c', 
    ], 
]; 

$result = array_filter(
    $data, 
    function ($value, $key) use ($data) { 
     return $key === array_search($value['user_id'], array_column($data,'user_id')); 
    }, 
    ARRAY_FILTER_USE_BOTH 
); 
var_dump($result); 
+0

洛尔刚刚看到它:D哇我疯了。我用德文打开了手册(http://php.net/manual/de/function.array-filter.php),并没有任何有关标志的内容。然后,我把它改为英语(http://php.net/manual/en/function.array-filter.php) – Rizier123 2015-02-23 10:34:19

+0

它实际上是对的情况下,整个主机非常有用的,我很高兴我上运行5.6我的生产箱 – 2015-02-23 10:35:58

+0

显示需要多长时间他们不同的翻译虽然 – 2015-02-23 10:36:34

0

如果user_id只是一个int或字符串,你可以使用它作为索引,这样:

$a = [ 
    [ 
     'id' => 1, 
    ], 
    [ 
     'id' => 2, 
    ], 
    [ 
     'id' => 3, 
    ], 
    [ 
     'id' => 1, 
    ], 
]; 

$b = array_reduce($a, function($carry, $item) { 
    $carry[$item['id']] = $item; 
    return $carry; 
}, []); 

var_dump($b); 

// Or more plainly like this: 
$b = []; 
foreach ($a as $val) { 
    $b[$val['id']] = $val; 
} 

var_dump($b); 

// If you want numerical indexes, just do this 
$b = array_values($b);