Проверьте то же значение в массиве - PullRequest
0 голосов
/ 07 мая 2018

У меня есть следующий массив:

$teams = [["id" => 1, "address" => "A1"],["id" => 2, "address" => "A1"],["id" => 3, "address" => "A2"]];

Как я могу проверить и получить команды с одинаковым адресом? Мой вывод должен быть Team ID 1 и 2? Учтите, что я не могу использовать жестко закодированный адрес. Данные являются динамическими и поступают из базы данных.

В php, laravel.

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Пройдите по массиву, запомните, какие адреса используются какой командой. Когда по ключу (адресу) хранится более одной команды, вы нашли дубликат:

<?php
$teams = [
     ["id" => 1, "address" => "A1"]
    ,["id" => 2, "address" => "A1"]
    ,["id" => 3, "address" => "A2"]
  ];

function findDuplicates($teams) {
  $addresses = [];
  foreach ($teams as $team) {
    if (!isset($addresses[$team["address"]])) {
      $addresses[$team["address"]] = [];
    }
    $addresses[$team["address"]][] = $team["id"];
  }
  foreach ($addresses as $address => $teamsHere) {
    if (count($teamsHere) > 1) {
      echo "Teams with same address (" . $address . "): " . join(",", $teamsHere) . "\n";
    }
  }
}

findDuplicates($teams);

Попробуйте онлайн!


Редактировать: менее "неуклюжий" подход с использованием array_* функций:

<?php
$teams = [
     ["id" => 1, "address" => "A1"]
    ,["id" => 2, "address" => "A1"]
    ,["id" => 3, "address" => "A2"]
  ];

function findDuplicates($teams) {
  $addresses = array_column($teams, "address");
  $counts = array_count_values($addresses);
  return array_filter($teams, function($team) use ($counts) { return $counts[$team["address"]] > 1; });
}

print_r(findDuplicates($teams));

Попробуйте онлайн!

0 голосов
/ 07 мая 2018

Другой способ сделать это - использовать array_column() и array_count_values(). Затем используйте array_filter() для удаления элементов без дубликатов:

$teams = [
 ["id" => 1, "address" => "A1"],
 ["id" => 2, "address" => "A1"] ,
 ["id" => 3, "address" => "A2"]
];

$dups = array_count_values(array_column($teams, 'address'));
$teams = array_filter($teams, function($item) use($dups) {
    return $dups[$item['address']] > 1;
});
print_r($teams);

Выходы (переформатированы):

Array
(
    [0] => Array([id] => 1, [address] => A1)
    [1] => Array([id] => 2, [address] => A1)
)
0 голосов
/ 07 мая 2018

Сначала вам нужно сгруппировать по их address, а затем вы можете использовать array_filter() для усечения вашего массива на основе критериев:

<?php
$teams = [["id" => 1, "address" => "A1"],["id" => 2, "address" => "A1"],["id" => 3, "address" => "A2"]];

// Set a new array
$filtered = [];

// Loop the teams
foreach($teams as $v)
{
    // Group the teams into their respective addresses
    $filtered[$v['address']][] = $v;
}

// Filter out any address with 1 or fewer teams
$filtered = array_filter($filtered, function($v){
    return count($v) > 1;
});

print_r($filtered);

// Now you can loop $filtered and display whatever you want

Выход:

Array
(
    [A1] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [address] => A1
                )

            [1] => Array
                (
                    [id] => 2
                    [address] => A1
                )

        )

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