PHP удаляет все объекты, кроме одного с тем же свойством из массива - PullRequest
0 голосов
/ 26 июня 2019

Используя Eloquent, я хочу удалить 2 объекта из массива $ output с 'Title' B и оставить только один.

$ output содержит следующую информацию:

[
    {
        "Title": "A",
        "Publication date": "2013",
    },
    {
        "Title": "B",
        "Publication date": "2010",
    },
    {
        "Title": "B",
        "Publication date": "2999",
    },
    {
        "Title": "B",
        "Publication date": "5555",
    },
];

Я знаю, что есть много сообщений об этом, но я не мог найти способ сделать это сам. Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Если это для массива / коллекции, а не для Eloquent запроса, вы можете использовать метод collection keyBy для получения уникальных значений.

https://laravel.com/docs/5.8/collections#method-keyby

$data = [
    [
        "Title" => "A",
        "Publication date" => "2013",
    ],
    [
        "Title" => "B",
        "Publication date" => "2010",
    ],
    [
        "Title" => "B",
        "Publication date" => "2999",
    ],
    [
        "Title" => "B",
        "Publication date" => "5555",
    ],
];

$collection = collect($data)->keyBy('Title');

Тогда ваш вывод будет выглядеть так:

Collection {#1389 
  #items: array:2 [
    "A" => array:2 [
      "Title" => "A"
      "Publication date" => "2013"
    ]
    "B" => array:2 [
      "Title" => "B"
      "Publication date" => "5555"
    ]
  ]
}

Метод keyBy даст вам последний элемент в коллекции для каждого Заголовка, так что вы можете отсортировать коллекцию перед вызовом keyBy, если вы хотите получить определенные элементы:

// get each Title with the highest Publication date
$collection = collect($data)->sortBy('Publication date')->keyBy('Title');

// get each Title with the lowest Publication date
$collection = collect($data)->sortByDesc('Publication date')->keyBy('Title');

Если вы хотите вернуть массив без ключей «A» и «B», то вы можете сделать это:

$collection = collect($data)->keyBy('Title')->values()->toArray();

Выход:

array:2 [
  0 => array:2 [
    "Title" => "A"
    "Publication date" => "2013"
  ]
  1 => array:2 [
    "Title" => "B"
    "Publication date" => "5555"
  ]
]
0 голосов
/ 26 июня 2019

Вы можете сделать это, используя destinct и groupBy в своем запросе.

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