Проверьте, имеют ли первые два элемента в коллекции Laravel одинаковую дату; если нет, выберите элемент с большей датой

У меня есть коллекция, содержащая два массива:

array:2 [
  0 => array:3 [
 
    "cde" => "cd542"
    "startDate" => "2022-10-27"
    "endDate" => null
  ]
  1 => array:3 [
    "cde" => "cd547"
    "startDate" => "2022-10-27"
    "endDate" => null
  ]
]
  1. взять первый элемент, если они имеют одинаковый код и одинаковую дату начала
  2. если у них разные startDate, возьмите самый последний

я попробовал метод ->contains, но он не работает

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это кажется странным вариантом использования, но это должно привести вас к правильному пути:

$sameElements = [
    [
        "Code" => "AKAR02",
        "startDate" => "2022-10-27",
        "endDate" => null,
    ],
    [
        "Code" => "AKAR02",
        "startDate" => "2022-10-27",
        "endDate" => null,
    ]
];

$collection = collect($sameElements);
[$first, $second] = $collection->only(0, 1);

if (
    $first['code'] === $second['code']
    && $first['startDate'] === $second['endDate']
) {
    // take the first element if they have the same code & the same start date
} else {
    // do something else?
}

//if they have different startDate take the most recent one
$diffElements = [
    [
        "Code" => "AKAR02",
        "startDate" => "2022-10-27",
        "endDate" => null,
    ],
    [
        "Code" => "AKAR02",
        "startDate" => "2022-10-01",
        "endDate" => null,
    ]
];

$collection = collect($diffElements);
[$first, $second] = $collection->only(0, 1);

// if they have different startDate take the most recent one
if ($first['startDate'] != $second['startDate']) {
    // do something with the most recent one
    $mostRecent = $collection->sort(function ($a, $b) {
        return strtotime($a['startDate']) <=> strtotime($b['startDate']);
    })->first();
} else {
    // do something else
}

При сравнении строк даты в формате Y-m-d нет необходимости вызывать strtotime(). Эти значения будут правильно сравниваться как простые строки. «Последние» должны быть $b <=> $a (в порядке убывания). Ваш ответ сравнивает $a <=> $b (в порядке возрастания).

mickmackusa 31.01.2023 22:40

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