Я только начал изучать PHP. Последние 3 дня мучаюсь на задании. Гугл отказывается помочь. Проблема в следующем.
Есть задача — найти самый низкий день среди случайно сгенерированных дат в массиве $ date. Вот что я сделал:
// Create two variables of type timestamp with the minimum and maximum value dates
$Min = strtotime('1970-01-01 00:00:00');
$Max = strtotime('3000-01-01 00:00:00');
// Create an array of 5 random dates, using a random number generator
for ($i = 0; $i<5; $i++) {$date[$i] = rand($min, $max);}
// Check, like all good
var_dump($date);
// Now I want to select the day of the accident the smallest output of dates. Or, for example, the largest month. I enter the command
$Y = min(date('d', $date[$i]));
var_dump($y);
Но браузер потом ругается, выдает ошибки:
(!) Примечание: неопределенное смещение: 5 дюймов
(!) Предупреждение: min (): если задан только один параметр, он должен быть
массив в
// Я пытался использовать знак — @, но это не решает проблему, а только скрывает ошибку.
Я понимаю, что ошибки означают, предположительно, неправильный индекс, и что $ Y — это не массив. Попробовал $ Y, выраженный в виде массива, но все равно было 5 ошибок
// Я попытался написать эту строку таким образом:
$Y = min(date('d', $date[0]), date('d', $date[1]), date('d', $date[2]), date('d', $date[3]), date('d', $date[4]));
!!! БИНГО !!! Все работало !!! Но Что если у меня будет 25 000 элементов в массиве $ date, как долго я собираюсь написать эту строку?
Уважаемые программисты, помогите пожалуйста. Как написать последнюю строчку рационально, кратко и четко, чтобы выполнить задачи без ошибок? Что случилось? Спасибо!
Надежным решением является использование цикла for для сравнения каждого элемента, возможно, цикла foreach.
$min = date('d', $date[0]);
foreach($date as $d){
$min = min(date('d', $d), $min);
}
Цикл for будет делать то же самое, но вы должны будете ссылаться на индексный номер. Но избавьте себя от проблем, если только вы не хотите знать, что это за элемент массива.
Я знаю, это кажется странным, но вы могли бы использовать то, что предоставляет маленький php (7):
// 10 random ints
$randoms = array_map(function(){
return rand();
},range(0,10));
// 10 random dates
$dates = array_map(function($rand_int){
// there is probably a easier way to do that
return (new DateTimeImmutable())->setTimeStamp($rand_int);
},$randoms);
// apply min and extract Day or whatever you like.
var_dump( min($dates)->format('Y-m-d - l') );
// result:
// string(21) "1974-11-23 - Saturday"
Следующее небольшое примечание является своего рода важным:
http://php.net/manual/en/datetime.diff.php
Начиная с PHP 5.2.2, объекты DateTime можно сравнивать с помощью операторов сравнения.
Который min
должен делать под капотом.
У вас почти получилось, только небольшие ошибки.
В php обычно пишут имена переменных в нижнем регистре, то же самое для имен функций.
// define all variables needed
$dates = array();
$min = strtotime('1970-01-01 00:00:00');
$max = strtotime('3000-01-01 00:00:00');
for ($i = 0; $i<5; $i++) {
$dates[$i] = rand($min, $max);
}
// lookup the lowest date int and convert it to a date string
$accident = date('d', min($dates));
Вы можете просто отсортировать метки времени в порядке убывания natsort
, а затем выберите первый элемент из отсортированного массива.
natsort($dates);
$lowest = $dates[0];
Таким образом, вы должны иметь первое минимально возможное значение из ваших временных меток.
Вот страница руководства на natsort для получения дополнительной информации о функции
мой друг.
перед использованием функций вы должны прочитать документацию о них.
поэтому вы не можете использовать strtotime так:
strtotime('3000-01-01 00:00:00');
он вернет вам «ложь», а не целое число. будь осторожен с этим.
http://php.net/manual/en/function.strtotime.php
и еще один:
http://php.net/manual/en/function.min.php
Также вы должны знать, что в php имя переменной чувствительно к регистру. так в вашем примере
$Min = strtotime('1970-01-01 00:00:00');
$Max = strtotime('3000-01-01 00:00:00');
// Create an array of 5 random dates, using a random number generator
for ($i = 0; $i<5; $i++) {$date[$i] = rand($min, $max);}
переменные $ min и $ Min различны.
поэтому переменная $ min не определена.
Теперь вы можете посмотреть на мое простое решение:
<?php
// Create two variables of type timestamp with the minimum and maximum value dates
$Min = strtotime('1970-01-01 00:00:00');
var_dump('Min = '. $Min);
$Max = strtotime('2030-01-01 00:00:00');
var_dump('Max = '. $Max);// Create an array of 5 random dates, using a random number generator
for ($i = 0; $i<5; $i++) {$date[$i] = rand($Min, $Max);}
// Check, like all good
var_dump($date);
// Now I want to select the day of the accident the smallest output of dates. Or, for example, the largest month. I enter the command
$array = [];
foreach($date as $value)
{
$array[date('Y-m-d', $value)] = date('d', $value);
}
var_dump($array);$Y = min($array);
var_dump($Y);