У меня есть кусок кода, который выберет x количество дней в будущем и распечатает его.
Затем я пытаюсь выбрать данные из этих временных меток и распечатать соответственно:
Ниже я выбираю количество дней в будущем, которое должно зацикливаться ($max
) и сколько там строк / данных ($data["cnt"]
)
$stmt=$dbh->prepare("select round((expire - unix_timestamp()) / 86400) as days, count(*) as cnt from xeon_users_rented WHERE user_by=:username group by days;");
$stmt->bindParam(":username",$userdata['username']);
$stmt->execute();
$data=$stmt->fetchAll();
$max = max(array_map(function($d){
return $d['days'];
}, $data));
$expireData = array();
Затем я перебираю x количество дней в будущем и распечатываю: (Допустим, что $x
is = 10)
for($x = 0; $x <= $max; $x++){
if ($data[$x]["cnt"] > 0){
$expireData[] = $data[$x]["cnt"];
}else{
$expireData[] = 0;
}
$stamp = strtotime('+'.$x.' day', time());
$expireDays[] = date("Y/m/d", $stamp);
}
Затем я распечатываю данные о днях и данные:
<?php echo implode("', '", $expireDays); ?>
<?php echo implode("', '", $expireData); ?>
Что дает мне:
'2014/11/05', '2014/11/06', '2014/11/07', '2014/11/08', '2014/11/09', '2014/11/10', '2014/11/11', '2014/11/12', '2014/11/13', '2014/11/14', '2014/11/15'
и (где каждая цифра представляет значение для этой конкретной даты)
2,8,0,0,0,0,0,0,0,0
Все идет нормально. Единственная проблема здесь в том, что данные (2,8,0,0etc.) Не верны. Например, должно быть:
0,0,2,0,0,0,8,0,0,0
Мой вопрос: Как я могу распечатать данные, где это соответствует отметке времени (xeon_users_rented.expire
)?
Чтобы упростить мой ответ до и ответить на ваш вопрос напрямую «Как я могу распечатать данные, где они соответствуют отметке времени«?
Сначала нужно указать метку времени Unix: «strtotime (‘+’. $ X. ‘Day’, time ());» в массив из вашего исходного цикла. Удалите вещи с истекшим сроком [] из этого цикла.
Затем выполните цикл по этому массиву и затем используйте array_search для поиска любых соответствующих индексов в массиве $ data.
if (found in $data array)
$expireDays[] = $data[array_search position]['cnt'];
else
$expireDays[] = 0;
Из того, что я собрал в том, что вы пытаетесь установить, SQL-запрос (например) возвращает массив, такой как:
$data = array(
array("days"=>232975857, "cnt"=> 4),
array("days"=>232975867, "cnt"=> 10),
array("days"=>232976689, "cnt"=> 0),
array("days"=>232976688, "cnt"=> 2)
);
Максимум в вашем случае — 10. Однако пожалуйста, обратите внимание что ваш код (ниже):
$max = max(array_map(function($d){
return $d['days'];
}, $data));
может вернуть много PHP E_NOTICE ошибки и быть медленным, потому что вы отрабатываете максимум из unix_timestamp на этом этапе, например 232975867 (слишком много циклов, я подозреваю, что вам нужно). Максимум должен быть разработан следующим образом, я подозреваю:
$max = count($data);
В моем случае (из моего примера с данными) это вернет что-то вроде 4, на которое должен ссылаться ваш код цикла for «<» не «<= «. Чтобы оптимизировать это, я бы на самом деле поместил прямо в цикл for» …; $ х < рассчитывать ($ данных); …; «если, конечно, вам не понадобится $ max позже.
Вот большая проблема для меня. Я не вижу, где в настоящее время у вас есть какая-либо корреляция между переменной $ stamp и столбцом «days» из вашего оператора sql. Возможно, я не видел достаточно информации от вас, чтобы полностью понять, или я неправильно интерпретирую ваш вопрос, но ваш sql для одного не обязательно будет возвращать те же даты, что и переменная штампа, будет вычисляться и не буду обязательно верните cnt 0 для любых дат, которые не существуют в этой таблице. Вот почему:
if ($data[$x]["cnt"] > 0){
часть раздела не нужна и, возможно, неверна.
Чтобы ответить на ваш вопрос, почему вы получаете «2,8,0,0,0,0 ….» вместо ожидаемого порядка, потому что sql не возвращает 0 значений cnt, так как просто не существует даты в это таблица, и ваш имплозд по-прежнему возвращает ‘0’, добавленные после того, как вы принудительно добавили послесловия 0 со строкой:
$expireData[] = 0;
Прежде всего, вам необходимо заполнить ваши данные (или переписать ваши данные, чтобы они содержали cnt of ‘0 в правильных местах массива). Вы можете добиться этого на уровне sql с помощью подзапроса, который обеспечивает отсутствие пропущенных дат, а затем применяет значение cnt 0. Я оставлю это вам на усмотрение, однако другой способ (через PHP) — сделать следующее (псевдокод):
place each 'stamps' (in unix format) in array from previous loop
forloop $i through $stamps
array_search $stamps against $data['days']
if (found)
$expireDays[] = $data[array_search position]['cnt'];
else
$expireDays[] = 0;
Это означает, что вы удаляете $ expireDays из вашего первого цикла.
Наконец, возможно, я неправильно понял, что ваш столбец ‘days’ не должен совпадать с датами $ stamp, поскольку эти даты находятся в будущем, а столбцы ‘days’ — в прошлом. В этом случае единственный вариант — настроить оператор SQL для принудительного включения пропущенных дат (между определенным диапазоном дат).
Удачи.