Я пытаюсь получить наименьшее значение начала и наибольшее значение конца вне объекта ниже. Объект является результатом сценария sql.
object(CI_DB_mysql_result)[18]
public 'conn_id' => resource(54, mysql link persistent)
public 'result_id' => resource(61, mysql result)
public 'result_array' =>
array (size=0)
empty
public 'result_object' =>
array (size=3)
0 =>
object(stdClass)[16]
public 'id' => string '601' (length=3)
public 'scheduled' => string '0' (length=1)
public 'start' => string '2014-10-17 06:00:00' (length=19)
public 'end' => string '2014-10-17 11:00:00' (length=19)
1 =>
object(stdClass)[19]
public 'id' => string '602' (length=3)
public 'scheduled' => string '0' (length=1)
public 'start' => string '2014-10-17 18:00:00' (length=19)
public 'end' => string '2014-10-17 19:30:00' (length=19)
2 =>
object(stdClass)[20]
public 'id' => string '603' (length=3)
public 'scheduled' => string '1' (length=1)
public 'start' => string '2014-10-17 11:00:00' (length=19)
public 'end' => string '2014-10-17 18:00:00' (length=19)
public 'custom_result_object' =>
array (size=0)
empty
public 'current_row' => int 0
public 'num_rows' => int 3
public 'row_data' => null
В этом случае самое маленькое значение start = ‘2014-10-17 06:00:00’ и самое большое значение end = ‘2014-10-17 19:30:00’. Итак, результат, который я ищу, выглядит так:
$smallest_start_value = '2014-10-17 06:00:00';
$biggest_end_value = '2014-10-17 19:30:00';
Как должен выглядеть код, чтобы вычислить этот результат?
Функция:
function unschedule_resource() {
$event_id = 4;//$_POST['event_id'];
$event_start = '2014-10-17 11:00:00';//$_POST['event_start'];
$event_end = '2014-10-17 18:00:00';//$_POST['event_end'];
// Get resource id
$this->db->select('
event.resource_id'
);
$this->db->from('promo_manager.event');
$this->db->where('event.id =', $event_id);
$data = $this->db->get();
foreach ($data->result() as $row) {
echo $row->resource_id . "<br>";
$resource_id = $row->resource_id;
}
// Get resource events to unschedule
$this->db->select('
resource_calendar.id,
resource_calendar.scheduled,
resource_calendar.start,
resource_calendar.end'
);
$this->db->from('promo_manager.resource_calendar');
$this->db->where('resource_calendar.resource_id =', $resource_id);
$this->db->where('resource_calendar.start =', $event_start);
$this->db->where('resource_calendar.end =', $event_end);
$this->db->or_where('resource_calendar.end =', $event_start);
$this->db->or_where('resource_calendar.start =', $event_end);
$data = $this->db->get();
$lowest_value = null;
$highest_value = null;
foreach ($data as $the_key => $the_value) {
if ($the_key == 'start') {
if ($lowest_value === null) {
$lowest_value = $the_value;
}
if ($the_value < $lowest_value) {
$lowest_value = $the_value;
}
}
}
//echo $lowest_value;
var_dump ($lowest_value) ;
}
Код Сэма должен выглядеть так:
$lowest_value = null;
$highest_value = null;
foreach($data as $obj) { //$data should be the array containing the result objects.
$start = $obj->start;
$end = $obj->end;
if ($lowest_value === null)
$lowest_value = $start;
else
if ($lowest_value > $start)
$lowest_value = $start;
if ($highest_value === null)
$highest_value = $end;
else
if ($highest_value < $end)
$highest_value = $end;
}
можно сократить до:
if ($lowest_value === null || $lowest_value > $start)
$lowest_value = $start;
if ($highest_value === null || $highest_value < $end)
$highest_value = $end;
Оба значения могут быть сгенерированы в течение одной итерации без проблем. Имейте в виду, что <
а также >
работает в том случае, если вы сохраняете дату, как указано. В противном случае вам нужно использовать функциональность даты для сравнения дат.
Вы также можете использовать MySQL для прямого запроса значений Min / Max, используя методы Aggregation Min или Max: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html
(Если вам не нужен каждый объект для загрузки, это будет быстрее)
Я не уверен, есть ли способ, которым вы не можете сделать это в операторе выбора или нет, я предполагаю, что нет. Получите ваш объект результата в массив. Это супер базовый, но должен сделать работу.
$lowest_value = null;
$highest_value = null;
foreach(result_object as $the_key => $the_value) {
if($the_key == 'start') {
if($lowest_value === null) {
$lowest_value = $the_value;
}
if(the_value < $lowest_value) {
$lowest_value = $the_value;
}
}
}
[/ NOEDIT]
Сделайте вторую проверку для конечного значения, просто меняя оператора