Как удалить дублирующее значение массива из многомерного ассоциативного массива? - PullRequest
0 голосов
/ 24 сентября 2018

содержит следующее: я пытаюсь получить значение array_unique из многомерного ассоциативного массива

Здесь я показываю только пример массива, который похож на этот.

$array =  ['games'=>[['vollyball', 'football'], ['vollyball', 'football'], ['rubby', 'chess']]];

Вот попробовал такfor

<code>foreach ($array as $key => &$value) {
    $value = array_unique($value);
}

echo "<pre>";
print_r($array);
echo "
"; выход;

Здесь я ожидаю вывод:

 $array =  ['games'=>[['vollyball', 'football'], ['rubby', 'chess']]];

Здесь массив должен быть таким же, даже после удаления дубликата из многомерного массива.

Спасибо за ваше время и предложения.

1 Ответ

0 голосов
/ 24 сентября 2018

вы можете попробовать следующее:

$a=array_values(array_unique(array_merge(...$array['games'])));

Предполагается, что все ваши используемые значения ниже $array['games'].

Редактировать:

Вот еще один способ, используя array_walk:

array_walk($array['games'],function($itm){global $res; $res[json_encode($itm)]=$itm;});

echo json_encode(array_values($res));

Мне не очень нравится глобальный массив $res, но я считаю, что это путь вперед.В функции обратного вызова array_walk() я добавляю все значения в ассоциативный массив ($res).Ключи являются JSON-представлениями их фактических значений.Таким образом, я перезапишу идентичные значения в ассоциативном массиве $res и получу набор уникальных значений, когда в конце применю функцию array_values(), чтобы превратить ее обратно в неассоциативный массив.

Результат:

[["vollyball","football"],["rubby","chess"]]

Вот небольшая демонстрация, которую вы можете проверить: http://rextester.com/JEKE60636

2.edit

Используя функцию-обертку, теперь я могу обойтись без глобальной переменной $res и выполнить операцию на месте, т.е. удалить дублирующиеся элементы непосредственно из исходного массива:

function unique(&$ag){
 array_walk($ag,function($itm,$key) use (&$ag,&$res) {
     if (isset($res[json_encode($itm)]))  array_splice($ag,$key,1);
     else                                 $res[json_encode($itm)]=1.;
 });
}

unique($array['games']);

echo json_encode($array)

Это приведет к

{"games":[["vollyball","football"],["rubby","chess"]]}

см. Здесь: http://rextester.com/YZLEK39965

...