PHP - Как удалить дубликаты ключей в многомерном массиве - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть многомерный массив. Я хочу удалить все дубликаты ключей, я пробовал, но не работал ни один скрипт.

Следующий ответ работает для дубликатов значений, и я хочу такое же решение для дубликатов ключейв многомерном массиве.

PHP удаляет повторяющиеся значения из многомерного массива

$arr = array(
    "a" => "xxx",
    "b" => "xxx",
    "c" => array(
        "g" => "xxx",
        "a" => "xxx",
        "h" => "xxx",
    ),
    "d" => "xxx",
    "e" => array(
        "i" => array(
            "a" => "xxx",
            "k" => array(
                "l" => "xxx",
                "b" => "xxx",
            ),
        ),
        "j" => "xxx",
    ),
    "f" => "xxx",
);

Я хочу этот результат:

$arr = array(
    "a" => "xxx",
    "b" => "xxx",
    "c" => array(
        "g" => "xxx",
        "h" => "xxx",
    ),
    "d" => "xxx",
    "e" => array(
        "i" => array(
            "k" => array(
                "l" => "xxx",
            ),
        ),
        "j" => "xxx",
    ),
    "f" => "xxx",
);

Iпытаюсь решить эту проблему с помощью этой функции:

function array_unique_key($array) { 
    $result = array(); 
    foreach (array_unique(array_keys($array)) as $tvalue) {
        if (is_array($tvalue)) {
            $result[$tvalue] = $array[$tvalue]; 
        }
        $result[$tvalue] = $array[$tvalue]; 
    } 
    return $result; 
} 

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Другой вариант, если вы хотите сохранить исходный массив.

function array_unique_key($input, &$keys = []) {

    // filter any preexisting keys from the input while adding its keys to the set of unique keys

    $input = array_filter($input, function($key) use (&$keys) {
        return isset($keys[$key]) ? false: $keys[$key] = true;
    }, ARRAY_FILTER_USE_KEY);

    // recursively map this function over the remaining values

    return array_map(function($value) use (&$keys) {
        return is_array($value) ? array_unique_key($value, $keys): $value;
    }, $input);

}
0 голосов
/ 12 февраля 2019

Эта функция будет делать то, что вы хотите.Он рекурсивно пересекает массив, ищет ключи, которые уже встречались, и где он их находит, удаляя этот элемент из массива.Обратите внимание, что мы передаем $array и $keys по ссылке на функцию, чтобы их можно было изменить (спасибо @ Don'tPanic за указание на то, что $keys также указывается ссылкой):

function remove_dup_keys(&$array, &$keys = array()) {
    foreach ($array as $key => &$value) {
        if (in_array($key, $keys)) {
            unset($array[$key]);
        }
        else {
            $keys[] = $key;
        }
    }
    foreach ($array as $key => &$value) {
        if (is_array($value)) {
            remove_dup_keys($value, $keys);
        }
    }
}

Вывод:

Array (
    [a] => xxx
    [b] => xxx
    [c] => Array (
        [g] => xxx
        [h] => xxx
    )
    [d] => xxx
    [e] => Array (
        [i] => Array (
             [k] => Array (
                 [l] => xxx
             )
        )
        [j] => xxx
    )
    [f] => xxx 
)

Демонстрация на 3v4l.org

...