Замените повторяющиеся значения плоского массива пустой строкой

Я заполняю массив дат из двух источников: массива дат и диапазона дат между двумя датами.

$dateann = ['2024-08-16', '2024-08-11', '2024-08-16', '2024-09-16'];
$period = CarbonPeriod::between('2024-08-01', '2024-08-31');
foreach ($period as $date) {
    $days[] = $date->format('Y-m-d');
}
$array_dates = array_merge($dateann, $days);

Это может привести к дублированию дат в объединенном массиве. Я хотел бы заменить любые повторяющиеся даты пустой строкой.

Текущий выход:

array: [
  0 => "2024-08-16"
  1 => "2024-08-11"
  2 => "2024-08-16"
  3 => "2024-09-05"
  4 => "2024-08-01"
  5 => "2024-08-02"
  6 => "2024-08-03"
  7 => "2024-08-04"
  8 => "2024-08-05"
  9 => "2024-08-06"
  10 => "2024-08-07"
  11 => "2024-08-08"
  12 => "2024-08-09"
  13 => "2024-08-10"
  14 => "2024-08-11"
  15 => "2024-08-12"
  16 => "2024-08-13"
  17 => "2024-08-14"
  18 => "2024-08-15"
  19 => "2024-08-16"
  20 => "2024-08-17"
  21 => "2024-08-18"
  22 => "2024-08-19"
  23 => "2024-08-20"
  24 => "2024-08-21"
]

Желаемый результат:

array: [
    0 => "2024-08-16"
    1 => "2024-08-11"
    2 => ""
    3 => "2024-09-05"
    4 => "2024-08-01"
    5 => "2024-08-02"
    6 => "2024-08-03"
    7 => "2024-08-04"
    8 => "2024-08-05"
    9 => "2024-08-06"
    10 => "2024-08-07"
    11 => "2024-08-08"
    12 => "2024-08-09"
    13 => "2024-08-10"
    14 => ""
    15 => "2024-08-12"
    16 => "2024-08-13"
    17 => "2024-08-14"
    18 => "2024-08-15"
    19 => ""
    20 => "2024-08-17"
    21 => "2024-08-18"
    22 => "2024-08-19"
    23 => "2024-08-20"
    24 => "2024-08-21"
]

Где ты застрял? Вы пробовали что-нибудь? Провели какое-нибудь исследование? Вы можете Google это за несколько секунд

ADyson 01.08.2024 22:58

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

maurice 01.08.2024 22:59

это не то, что я хочу, я пытался это использовать, но это не тот результат, который я хочу получить

maurice 01.08.2024 23:02

вместо повторяющегося значения я хочу получить пустое место (ОНО ОЧЕНЬ РАЗНОЕ)

maurice 01.08.2024 23:03

Перебрать массив. Используйте array_search(), чтобы найти первый индекс текущего значения. Если он не равен текущему индексу, замените значение пустой строкой.

Barmar 01.08.2024 23:10
if (array_search($value, $array) != $index) { $array[$index] == ''; }
Barmar 01.08.2024 23:11

Зачем вам пустое место?? Конечно, это просто вызовет проблемы, когда вы позже приступите к обработке этих данных, поскольку вам придется иметь особый случай для работы с пустыми местами. Какую выгоду вы получите, оставив пустые?

ADyson 01.08.2024 23:13

@Бармар, я вставил свой код. Подскажите, пожалуйста, как это сделать?

maurice 01.08.2024 23:15

@ADyson В таблице мне нужно распечатать строки с данными, относящимися к этой дате, без повторного повторения даты в следующей строке.

maurice 01.08.2024 23:16

@Морис, ок. Вы никогда не говорили, что речь идет о каких-либо других данных.

ADyson 02.08.2024 00:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
2
10
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Проверьте, совпадает ли текущий индекс с первым индексом значения. Если нет, замените значение пустой строкой.

foreach ($array_dates as $index => $value) {
    if (array_search($value, $array_dates) != $index) {
        $array_dates[$index] = '';
    }
}

Прекрасное спасибо. Есть ли способ сортировки? Я использовал сортировку, но она не работает

maurice 01.08.2024 23:19

Я не могу придумать причину, по которой sort($array_dates) не сработает.

Barmar 01.08.2024 23:21

он возвращает только true, а не отсортированный массив

maurice 01.08.2024 23:22

Он изменяет массив на месте, возвращаемое значение не требуется.

Barmar 01.08.2024 23:23

Извините, я не понимаю. Что ты имеешь в виду? Я пытался сделать dd(($array_dates)); и он возвращает истину

maurice 01.08.2024 23:25

Не делайте $array_dates = sort($array_dates);. Просто позвоните sort() без задания.

Barmar 01.08.2024 23:26

Я просто написал это так: dd(sort($array_dates));

maurice 01.08.2024 23:28

Сделайте sort($array_dates); dd($array_dates);. sort() не возвращает отсортированный массив.

Barmar 01.08.2024 23:29

Для сравнения производительности поиск по значению с использованием вызовов array_search() будет менее эффективным, чем поиск по ключам. Вот демонстрация того, как пропустить этап слияния и использовать методы объединения нулей в массиве поиска, размер которого увеличивается только при обнаружении уникальных дат.

Код: (Демо-версия PHPize)

$dateann = ['2024-08-16', '2024-08-11', '2024-08-16', '2024-09-16'];
foreach ($dateann as &$date) {
    $date = $lookup[$date] ?? $date;  // if not in the lookup, it's new
    $lookup[$date] ??= '';  // flag the date in the lookup to only return an empty string
}
$period = CarbonPeriod::between('2024-08-01', '2024-08-31');
foreach ($period as $obj) {
    $ymd = $obj->format('Y-m-d');
    $dateann[] = $lookup[$ymd] ?? $ymd;  // if not in the lookup, it's new
    $lookup[$ymd] ??= '';  // flag the date in the lookup to only return an empty string
}
var_export($dateann);

Код работает отлично; Я даю лучший ответ на предыдущий только потому, что он был дан первым. Спасибо, в любом случае

maurice 03.08.2024 16:39

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