Как удалить узлы с одним и тем же ключом из многомерного массива в php? - PullRequest
0 голосов
/ 30 сентября 2019
     $array= array(
        Array(
            "4187~2" => Array (
                    "providerId" => 2,
                    "pFEP" => 80,
                ),
             "4187~1" => Array (
                    "providerId" => 1,
                    "pFEP" => 10,
                ),
        ),
        Array(
            "4187~2" => Array (
                    "providerId" => 2,
                    "pFEP" => 80,
                ),
            "4187~1" => Array (
                    "providerId" => 1,
                    "pFEP" => 10,
                ),
        ),
        Array(
            "4187~2"=> Array
                (
                    "providerId" => 2,
                    "pFEP" => 80,
                ),
           "4187~1" => Array (
                    "providerId" => 1,
                    "pFEP" => 10,
                ),
           "5046~2" => Array  (
                    "providerId" => 2,
                    "pFEP" => 15
                ),
        ));

Требуется вывод:

$output = array(
    Array(
        "4187~2" => Array
            (
                "providerId" => 2,
                "pFEP" => 80,
            ),
       "4187~1" => Array
            (
                "providerId" => 1,
                "pFEP" => 10,
            ),
        "5046~2" => Array
            (
                "providerId" => 2,
                "pFEP" => 15
            ),
   ));

Я попробовал следующую функцию от Google. Это не дает требуемого вывода:

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

print_r(array_unique_key($array));

1 Ответ

0 голосов
/ 30 сентября 2019

Это приводит к желаемому выводу:

<?php
$input = [
  [
    "4187~2" => [
      "providerId" => 2,
      "pFEP" => 80
    ],
    "4187~1" => [
      "providerId" => 1,
      "pFEP" => 10
    ]
  ],
  [
    "4187~2" => [
      "providerId" => 2,
      "pFEP" => 80
    ],
    "4187~1" => [
      "providerId" => 1,
      "pFEP" => 10
    ]
  ],
  [
    "4187~2"=> [
      "providerId" => 2,
      "pFEP" => 80
    ],
    "4187~1" => [
      "providerId" => 1,
      "pFEP" => 10
    ],
    "5046~2" => [
      "providerId" => 2,
      "pFEP" => 15
    ]
  ]
];


$output = [];
array_walk($input, function($set) use (&$output) {
  array_walk($set, function($entry, $key) use (&$output) {
    if (!array_key_exists($key, $output)) {
      $output[$key] = $entry;
    }
  });
});
print_r($output);

Вывод очевидно:

Array
(
    [4187~2] => Array
        (
            [providerId] => 2
            [pFEP] => 80
        )

    [4187~1] => Array
        (
            [providerId] => 1
            [pFEP] => 10
        )

    [5046~2] => Array
        (
            [providerId] => 2
            [pFEP] => 15
        )
)

Однако это вызывает вопросы:

Ват, если содержимое записей равно не одинаково для разных записей вашего внешнего массива? Кто победит?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...