2011-03-23 81 views
0

我有一個數組,看起來像這樣,當我用var_dump:從陣列中刪除重複項與PHP

array(4) { 
    [0]=> array(2) { 
    [0]=> string(1) "1" 
    ["userID"]=> string(1) "1" 
    } 
    [1]=> array(2) { 
    [0]=> string(1) "2" 
    ["userID"]=> string(1) "2" 
    } 
    [2]=> array(2) { 
    [0]=> string(1) "1" 
    ["userID"]=> string(1) "1" 
    } 
    [3]=> array(2) { 
    [0]=> string(1) "1" 
    ["userID"]=> string(1) "1" 
    } 
} 

也就是說1,2,1,1

我使用array_unique($arr)但這個陣列上受審,而不是把它變成1,2,它只是把數組變成1

它應該工作,但我不知道爲什麼它不。

+0

,你正在尋找的合成陣列是什麼? 「把[陣列]變成'1,2'」對我來說沒有多大意義。 – erisco 2011-03-23 22:41:25

回答

2

我猜測你所關心的只是知道結果集中存在哪些用戶標識。因此,我會先將數組拉平。這樣做後,我可以申請array_unique以獲得唯一的值。正如其他人所說,array_unique不適用於多維數組。

$flattened = array_map(
    function($e) { return $e['userID']; }, 
    $array 
); 
$unique = array_unique($flattened); 

如果你喜歡foreach循環,那麼它看起來像這樣。

$flattened = array(); 
foreach ($array as $v) { 
    $flattened[] = $v['userId']; 
} 
$unique = array_unique($flattened); 

也有尋找其在array_unique提供了性能提升的獨特元素的替代 - O(n)的時間複雜度與O(nlogn)。也就是說,array_unique($array)相當於array_keys(array_flip($array))

4

array_unique只刪除相同字符串值的元素。子陣列不是這種情況。

您將需要手動遍歷數組(使用用戶函數排序後)並取消設置雙精度。不漂亮,對不起。

+0

我不認爲他*需要*,但它是一個選項。 – erisco 2011-03-23 22:44:37

2

A類快速和骯髒的方法可能會遍歷所有元素,序列化值,並使用這些作爲一個包含自己的價值觀,以及一個新的數組鍵則該數組像這樣上使用array_values()

<?php 
function array_unique_recursive(array $a) { 
    $result = array(); 
    foreach ($a as $item) 
     $result[serialize($item)] = $item; 
    return array_values($result); 
} 
?> 
0
<?php 
$arr = array(
       array (0=>"1", 
         userID=>"1"), 
       array (0=>"2", 
         userID=>"2"), 
     array (0=>"1", 
         userID=>"1"), 
     array (0=>"1", 
         userID=>"1")); 

    $arr_unique=array_unique($arr); 
    echo '<pre>'; 
    var_dump($arr_unique); 
    echo '</pre>'; 
?> 
0

嘗試使用排序規則的過濾器... <?php $arr = array_unique($arr, SORT_REGULAR); ?>