Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Вывод в зависимости от даты


Автор: Sice 29.2.2012, 15:40
В общем имеется 6 массивов с данными. Примерно такого вида:
Код

$campany1 = array('name' => "Название кампании",
                  'start_day' => "Monday",
                  'start_time_1_hour' => "11",
                  'start_time_1_min' => "30",
                  'start_time_2_hour' => "23",
                  'start_time_2_min' => "00",
                   'duration' => "30 мин", // Длительность
                  'location' => "Деревня",
                  'prize' => "Знак Отличия",
                  'remains' => "" //Осталось до начала
);
 

Мне нужно в зависимости от дня недели и времени выводить именно ближайшую запись, по времени.
Вот думаю как это правильно сделать ? Вариант с:
Код

$date = getdate();

if($date['weekday']==Monday){
foreach($campnay1 as $value => $k){
echo "<b>$value</b><br>";
}
}
 

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

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

Автор: Task 29.2.2012, 16:07
И данные массивы служат исключительно для этой цели - выбор необходимого по времени?

Автор: Sice 29.2.2012, 16:15
Цитата(Task @ 29.2.2012,  16:07)
И данные массивы служат исключительно для этой цели - выбор необходимого по времени?

Ну в принципе да smile или это не совсем правильно/удобно делать ?
БД не хочется задействовать просто smile

Автор: Task 29.2.2012, 16:24
Ну тогда удобнее эти массивы держать в одном массиве, а ключами их сделать время в timestamp, тогда с помощью array_intersect_key и strtotime будете получать нужный (нужные массивы), при этом совсем не обязательно держать в них ключи  'start_day', 'start_time_1_hour' и   'start_time_1_min', ключ массива это содержать будет.
Если не удобно так, можете сделать ключом и строковое значение.

PS. А по какой причине недобна БД? Она бы, кстати, выдала вам как раз необходимое.

Автор: baldina 29.2.2012, 16:51
нужна другая структура данных: что бы элементы данных индексировались по дню недели и были отсортированы по времени, например 
Код

function create_work_item ($data) {
  for ($i=1; $data["start_time_${i}_hour"]!==null; ++$i) {
    $time = $data["start_time_${i}_hour"].$data["start_time_${i}_min"];
    $new_data[$time]=$data;
  }
  ksort($new_data);
  return array($data['start_day'], $new_data);
}

list ($key, $value) = create_work_item ($campany1);
$items[$key] = $value;
list ($key, $value) = create_work_item ($campany2);
$items[$key] = $value;
list ($key, $value) = create_work_item ($campany3);
$items[$key] = $value;
...
list ($key, $value) = create_work_item ($campanyN);
$items[$key] = $value;


тогда получить ближайший по времени элемент просто:
Код

$date = getdate();
$current_time = $date['hours'] . $date['minutes'];
$today_items = $items[$date['weekday']];
for_each ($today_items as $time=>$item) {
  if ($time > $current_time)
    return $item;
}


Добавлено через 1 минуту и 40 секунд
Цитата(Sice @  29.2.2012,  16:15 Найти цитируемый пост)
Ну в принципе да

раз так, то структуру сразу можно в нужном виде хранить

Автор: Sice 29.2.2012, 17:05
Спасибо Вам большое!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)