Удалить дубликаты элементов внутри многомерного массива - PullRequest
0 голосов
/ 20 октября 2018

У меня есть массив, который содержит несколько одинаковых данных:

array(2) {
  [0]=>
  array(2) {
    ["id"]=>
    string(11) "43000173601"
    ["data"]=>
    array(2) {
      [0]=>
      array(2) {
        ["id"]=>
        string(5) "52874"
        ["name"]=>
        string(3) "x70"
      }
      [1]=>
      array(2) {
        ["id"]=>
        string(5) "52874"
        ["name"]=>
        string(3) "x70"
      }
    }
  }
  [1]=>
  array(2) {
    ["id"]=>
    string(11) "43000173602"
    ["data"]=>
    array(1) {
      [0]=>
      array(2) {
        ["id"]=>
        string(5) "52874"
        ["name"]=>
        string(3) "x70"
      }
    }
  }
}

Я пытался использовать array_unique() для удаления этих записей, но получаю эту ошибку:

Преобразование массива в строку

Внешние массивы содержат идентификаторы маршрутов, некоторые автобусы могут иметь 2 разных маршрута, поэтому в этом случае они могут остаться, однако я просто хочу удалить записи дублирования внутри маршрута 1:

[0]=>
  array(2) {
    ["id"]=>
    string(11) "43000173601"
    ["data"]=>
    array(2) {
      [0]=>
      array(2) {
        ["id"]=>
        string(5) "52874"
        ["name"]=>
        string(3) "x70"
      }
      [1]=>
      array(2) {
        ["id"]=>
        string(5) "52874"
        ["name"]=>
        string(3) "x70"
      }
    }

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

Вы можете использовать array_column, чтобы сделать массив ассоциативным.Это удалит все дубликаты.
Array_values ​​затем удалит ассоциативный код и снова сделает его обычным индексированным массивом.
Rsort гарантирует, что вы получите самый низкий ключ в качестве массива результатов.

rsort($arr);
$arr = array_values(array_column($arr, Null, "id"));
0 голосов
/ 20 октября 2018

Я исправил это следующим образом:

$stripped = [];
foreach($arr as $single) {
    $stripped[] = ['id' => $single['id'], 'data' => array_unique($single['data'])];
}

Поскольку дубликаты существовали во внутренних массивах, а не во внешнем массиве, мне пришлось использовать array_unique() для внутренних массивов.

0 голосов
/ 20 октября 2018

Код может быть примерно таким:

$new_array = [];
foreach ($your_array as $item) {
    if (!isset($new_array[$item['id']])) {
        // item id is not in `new_array` - add `item`
        $new_array[$item['id']] = $item;
    } else {
        // item id already presents - add `data` item to it
        $new_array[$item['id']]['data'][] = $item['data'];
    }
}
...