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.

これが私の試みのフィドルです

私のアプローチは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);

しかし、それは私にとってはうまくいきません。

4

3 に答える 3

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
于 2014-09-03T00:48:07.347 に答える
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);

編集:

フィドルはこちら

于 2014-09-03T01:00:24.207 に答える