У меня есть массив с ключами в формате Y-m-d
. Я хочу отфильтровать массив, чтобы единственные сохраненные строки были связаны с последним днем года-месяца.
Пример массива:
array:4 [▼
"2022-10-30" => array:9 [▶]
"2022-10-31" => array:6 [▶]
"2022-11-07" => array:4 [▶]
"2022-11-09" => array:3 [▶]
]
Желаемый результат:
array:2 [▼
"2022-10-31" => array:6 [▶]
"2022-11-09" => array:3 [▶]
]
Важно: в этом массиве могут быть другие месяцы, и не каждый день каждого месяца представлен во входном массиве.
Я начал писать код, но не знаю, что делать дальше.
public function monthly_average()
{
global $datas,$dates;
$args= $this->period_monthAverage($datas,$dates);
dump($args);
//dump($datas);
dump($dates);
dump($dates[0]>$dates[1]);
$fdate=array();
for ($i = 0; $i <= sizeof($dates); $i++){
if (date('m',strtotime($date[i]))==date('m',strtotime($date[i+1]))){
}
//dump((date('m',strtotime($date)))); 10- 11
}
}
@ Имран, это другая задача.
Я не ищу последний день месяца, я ищу последний день в своем собственном списке @Imran
«найти максимальную дату месяца в моем списке», я искал так, но не смог найти ни одного работающего кода-@mickmackusa
@NicoHaase "найди максимальную дату месяца в моем списке", ты можешь помочь?
Ага, могу: максимум в том списке, как написано, "2022-10-31" и "2022-11-09". Но я бы предположил, что вы хотите иметь это для динамического списка, содержащего разные даты? Тогда, возможно, вам следует написать какой-нибудь код, перебирая ключи, помещая их в разные подмассивы, сгруппированные по месяцам, а затем получая максимальное значение каждого из этих подмассивов?
как создать динамический массив в php? Например, как мне создать мгновенный ключ для августа и сентября и поместить в него все даты? @НикоХаасе
это не моя проблема @steven7mwesigwa, пожалуйста, прочитайте еще раз
@Aleyn Даты одного года?
@Imran, пожалуйста, отзовите свое закрытое голосование, чтобы не тратить время добровольцев, которые найдут этот вопрос в очереди на рассмотрение.
@mickmackusa я поделился всем, чем мог
Отсортируйте массив по ключу (от нового к старому), сгруппируйте их по номеру месяца, затем взорвите ключ массива по номеру месяца (-11), последний элемент при первой попытке — это максимальное число, а последний элемент — минимальный. Вы также можете попробовать Split и другие методы на карте массива.
@Meh, пожалуйста, используйте комментарии, чтобы получить разъяснения от спрашивающего. Вы не должны давать советы по решению проблемы в виде комментария, поскольку это является вопиющим пренебрежением к простому дизайну вопросов и ответов этой платформы.
Я откатил историю изменений, потому что ваше изменение в образце данных сделало мой ответ недействительным и потому что вы усвоили мой ответ, чтобы исказить код, который вы создали самостоятельно.
Поддерживайте массив поиска значений с ключом год-месяц, где значения представляют собой последний день месяца в календаре.
Когда наступит более поздняя дата месяца, замените элементы в результате и обновите массив поиска.
Код: (Демо)
$result = [];
foreach ($array as $key => $value) {
$ym = substr($key, 0, 7);
if (!isset($lookup[$ym]) || $lookup[$ym] < $key) {
$result[$key] = $value;
if (isset($lookup[$ym])) {
unset($result[$lookup[$ym]]);
}
$lookup[$ym] = $key;
}
}
var_export($result);
Или написано с меньшим количеством вызовов функций: (Demo)
$result = [];
foreach ($array as $key => $value) {
$ym = substr($key, 0, 7);
if (!isset($lookup[$ym])) {
$result[$key] = $value;
$lookup[$ym] = $key;
} elseif ($lookup[$ym] < $key) {
unset($result[$lookup[$ym]]);
$result[$key] = $value;
$lookup[$ym] = $key;
}
}
Демы были действительно поучительны, я смог адаптировать их под себя, большое спасибо, вам было очень интересно
"Я не смог построить скрипт" - почему бы и нет?