Удалить дубликаты из многомерного ассоциативного массива в PHP, если два значения совпадают

StackOverflow https://stackoverflow.com//questions/23065281

Вопрос

У меня есть многомерный массив следующей структуры, и я хочу удалить дубликаты из него.Например, если [«сумма»] одинаково для двух [«города»], но [«время»] является одинаковым или другим, тогда я считаю, что это дубликат и хочу удалить этот узел из массива.

.

В следующем примере я хочу удалить полностью узел 0 из массива, поскольку город и сумма такие же, как узел 1. Они оба Бристоль (Бристоль, Великобритания), так и 373, хотя время отличается 17:15 и 17:16.

Если время разные, как в этом случае, я бы удалил более позднее время.

array(8) {
  [0]=>
  array(3) {
    ["time"]=>
    string(5) "17:16"
    ["city"]=>
    string(33) "Bristol (Bristol, United Kingdom)"
    ["amount"]=>
    int(373)
  }
  [1]=>
  array(3) {
    ["time"]=>
    string(5) "17:15"
    ["city"]=>
    string(33) "Bristol (Bristol, United Kingdom)"
    ["amount"]=>
    int(373)
  }
  [2]=>
  array(3) {
    ["time"]=>
    string(5) "17:16"
    ["city"]=>
    string(37) "Wednesbury (Sandwell, United Kingdom)"
    ["amount"]=>
    int(699)
  }
  [3]=>
  array(3) {
    ["time"]=>
    string(5) "17:16"
    ["city"]=>
    string(45) "Wolverhampton (Wolverhampton, United Kingdom)"
    ["amount"]=>
    int(412)
  }
  [4]=>
  array(3) {
    ["time"]=>
    string(5) "17:15"
    ["city"]=>
    string(33) "Swansea (Swansea, United Kingdom)"
    ["amount"]=>
    int(249)
  }
  [5]=>
  array(3) {
    ["time"]=>
    string(5) "17:16"
    ["city"]=>
    string(39) "Watford (Hertfordshire, United Kingdom)"
    ["amount"]=>
    int(229)
  }
  [6]=>
  array(3) {
    ["time"]=>
    string(5) "17:14"
    ["city"]=>
    string(39) "Nottingham (Nottingham, United Kingdom)"
    ["amount"]=>
    int(139)
  }
  [7]=>
  array(3) {
    ["time"]=>
    string(5) "17:13"
    ["city"]=>
    string(31) "Dartford (Kent, United Kingdom)"
    ["amount"]=>
    int(103)
  }
}
.

Это было полезно?

Решение

<?php

$data = array(
    array(
        'time' => '17:16',
        'city' => 'Bristol',
        'amount' => 373,
    ),
    array(
        'time' => '18:16',
        'city' => 'Bristol',
        'amount' => 373,
    ),
    array(
        'time' => '18:16',
        'city' => 'Wednesbury',
        'amount' => 699,
    ),
    array(
        'time' => '19:16',
        'city' => 'Wednesbury',
        'amount' => 699,
    ),
);

$tmp = array();
foreach ($data as $row) {
    $city   = $row['city'];
    $amount = $row['amount'];

    if (!isset($tmp[$city][$amount]) 
        || $tmp[$city][$amount]['time'] < $row['time']) {
        $tmp[$city][$amount] = $row;
    }
}

$data = array();

foreach ($tmp as $cities) {
    foreach ($cities as $city) {
        $data[] = $city;
    }
}

var_dump($data);
.

Другие советы

Попробуйте:

$result = array();
foreach ($array as $place) {
    if (!array_key_exists($place['time'], $result)) {
        $result[$place['time']] = $place;
    }
}
.

Создайте двумерную ассоциативный массив, где один измерение связан с городом, а другой - это сумма:

$assoc = array();
foreach ($data as $el) {
    $city = $el['city'];
    $amount = $el['amount'];
    if (isset($assoc[$city]) {
        $assoc[$city][$amount] = $el;
    } else {
        $assoc[$city] = array($amount => $el);
    }
}

// Now gather up all the elements back into a single array
$result = array();
foreach ($assoc as $cities)
    foreach ($cities as $city) {
        $result[] = $city;
    }
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top