Я заполняю массив дат из двух источников: массива дат и диапазона дат между двумя датами.
$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"
]
Я не знаю, как восстановить первое повторяющееся значение и удалить дубликаты, кроме первого.
это не то, что я хочу, я пытался это использовать, но это не тот результат, который я хочу получить
вместо повторяющегося значения я хочу получить пустое место (ОНО ОЧЕНЬ РАЗНОЕ)
Перебрать массив. Используйте array_search(), чтобы найти первый индекс текущего значения. Если он не равен текущему индексу, замените значение пустой строкой.
if (array_search($value, $array) != $index) { $array[$index] == ''; }Зачем вам пустое место?? Конечно, это просто вызовет проблемы, когда вы позже приступите к обработке этих данных, поскольку вам придется иметь особый случай для работы с пустыми местами. Какую выгоду вы получите, оставив пустые?
@Бармар, я вставил свой код. Подскажите, пожалуйста, как это сделать?
@ADyson В таблице мне нужно распечатать строки с данными, относящимися к этой дате, без повторного повторения даты в следующей строке.
@Морис, ок. Вы никогда не говорили, что речь идет о каких-либо других данных.






Проверьте, совпадает ли текущий индекс с первым индексом значения. Если нет, замените значение пустой строкой.
foreach ($array_dates as $index => $value) {
if (array_search($value, $array_dates) != $index) {
$array_dates[$index] = '';
}
}
Прекрасное спасибо. Есть ли способ сортировки? Я использовал сортировку, но она не работает
Я не могу придумать причину, по которой sort($array_dates) не сработает.
он возвращает только true, а не отсортированный массив
Он изменяет массив на месте, возвращаемое значение не требуется.
Извините, я не понимаю. Что ты имеешь в виду? Я пытался сделать dd(($array_dates)); и он возвращает истину
Не делайте $array_dates = sort($array_dates);. Просто позвоните sort() без задания.
Я просто написал это так: dd(sort($array_dates));
Сделайте sort($array_dates); dd($array_dates);. sort() не возвращает отсортированный массив.
Для сравнения производительности поиск по значению с использованием вызовов 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);
Код работает отлично; Я даю лучший ответ на предыдущий только потому, что он был дан первым. Спасибо, в любом случае
Где ты застрял? Вы пробовали что-нибудь? Провели какое-нибудь исследование? Вы можете Google это за несколько секунд