1

我有一個由未確定數量的數組遞歸(深度n級)組成的數組。每個陣列可能包含一個name密鑰。我想創建這些值的唯一列表。從深度數組中的任意位置存在的特定鍵值中創建一個唯一值列表

假設陣列是:

$bigArray = array(
    'name'=>'one', 
    'something'=>array(
     'name'=>'two', 
     'subthing'=>array('name'=>'three') 
    ), 
    'anotherthing'=>array('name'=>'one') 
); 

預期的結果將是:

$uniques = array('one', 'two', 'three') // All the 'name' keys values and without duplicates. 

這裏的一個fiddle of my attempt

我的方法是使用array_walk_recursive傳遞$uniques數組作爲參考,並允許函數來更新該值:

$uniques = array(); 

function singleOut($item, $key, &$uniques) { 
    if ($key == 'name' && !in_array($itm,$uniques,true)) 
     $uniques[] = $item; 
} 

array_walk_recursive($bigArray, 'singleOut', $uniques); 

然而,這不是爲我工作。

回答

0

你也可以在這一個上使用array_unique。例如:

$uniques = array(); 
array_walk_recursive($bigArray, function($val, $key) use (&$uniques){ 
    if($key == 'name') { 
     $uniques[] = $val; 
    } 
}); 

$uniques = array_unique($uniques); // unique values 
+0

對於這個問題的範圍,一個鬆散的比較就好了。但是,當對可能爲_0的鍵進行鬆散比較時,請訪問此鏈接以查看潛在的意外結果(感謝PHP的類型雜耍)。 [類型雜耍,而鬆散比較產生不必要的結果](https://stackoverflow.com/questions/44426990/type-juggling-while-making-loose-comparison-yields-unwanted-result)] – mickmackusa 2017-09-08 02:23:14

0

你撥弄幾乎被發現在 - 問題是,用戶參數通過引用只在遞歸的相同水平給出。您需要使用間接與參考:

$bigArray = array(
    'name'=>'one', 
    'something'=>array(
     'name'=>'two', 
     'subthing'=>array('name'=>'three') 
    ), 
    'anotherthing'=>array('name'=>'one') 
); 

function singleOut($item, $key, $indirect) { 
    $uniques=&$indirect[0]; 
    if ($key == 'name' && !in_array($item,$uniques,true)) $uniques[] = $item; 

} 

$uniques = array(); 
$indirect = array(&$uniques); 
array_walk_recursive($bigArray, 'singleOut', $indirect); 
print_r($uniques); 

編輯:

小提琴是here

0

避免這樣做的array_walk_recursive()內的in_array()檢查,可以存儲name值的鍵輸出數組。這將通過覆蓋先前相同的密鑰來有效地消除重複。當array_walk_recursive()完成時,您可以使用array_keys()將數據從鍵移動到值。

代碼:(Demo

$bigArray=[ 
    'name'=>'one', 
    'something'=>[ 
     'name'=>'two', 
     'subthing'=>['name'=>'three'] 
    ], 
    'anotherthing'=>['name'=>'one'] 
]; 
array_walk_recursive($bigArray,function($v,$k)use(&$uniques){ 
    if($k==='name') 
     $uniques[$v]=''; 
}); 
var_export(array_keys($uniques)); 

輸出:

array (
    0 => 'one', 
    1 => 'two', 
    2 => 'three', 
) 

由於array_unique()可以是在某些情況下速度慢,使用array_keys()通常應該執行速度更快。也就是說,如果微觀優化是一個問題,那麼您應該使用您的實際數據和特定環境進行基準測試,併爲您的項目選擇最佳方法。

正如我在Ghost的回答下的評論中提到的那樣,對多維數組中的鍵進行===嚴格比較是一種好習慣,因爲如果您正在查找字符串,但遇到0鍵,則PHP的類型雜耍「功能」將提供意想不到的結果。

這裏是一個網頁,我討論並演示此行爲:Type juggling while making loose comparison yields unwanted result

相關問題