Использование array_shift в цикле while с fetchAll() в SELECT * из mysql

У меня есть вопрос о том, как работает использование *array_shift* с fetchAll в цикле while в этом примере? Предполагаемый результат - просто получить данные из базы данных и использовать их для заполнения приложения CRUD.

Я понимаю, что *array_shift* удаляет первый результат массива, но я не уверен, почему это не влияет на результаты, возвращаемые в этом примере. Просто пытаюсь окунуться в этот процесс.

$pdo = Database::connect();
$sql = $pdo->prepare("SELECT * FROM contacts ORDER BY name ASC");
$sql->execute();
$result = $sql->fetchAll(PDO::FETCH_ASSOC);

$contacts = array();
while ($obj = array_shift($result)) {
    $contacts[] = $obj;
}
return $contacts;

person webdev    schedule 02.01.2014    source источник
comment
Что именно вы пытаетесь сделать?   -  person Explosion Pills    schedule 02.01.2014
comment
Просто прокрутите результаты и выведите.   -  person webdev    schedule 02.01.2014
comment
Так почему бы не просто $contacts = $sql->fetchAll(PDO::FETCH_ASSOC)? Это было бы эквивалентно тому, что вы делаете.   -  person Explosion Pills    schedule 02.01.2014
comment
Правильно, это альтернатива, но мой вопрос о том, как работает array_shift в этом примере.   -  person webdev    schedule 02.01.2014
comment
Он удаляет первый элемент из $result и устанавливает его в $obj. Это делается в цикле. Когда $result пусто, array_shift вернет ложное значение и разорвет цикл   -  person Explosion Pills    schedule 02.01.2014
comment
Хм, интересно, можете ли вы подробнее рассказать о том, как array_shift возвращает ложное значение и прерывает цикл?   -  person webdev    schedule 02.01.2014


Ответы (1)


array_shift удалит первый элемент из массива и вернет его. Итак, если у вас есть массив, например

array("one", "two", "three")

Использование array_shift вернет "one", а исходный массив будет обновлен до array("two", "three"). Когда это делается в цикле, это означает, что в конечном итоге исходный массив будет сокращен до array().

Согласно документации, array_shift для пустого массива возвращает NULL. Вы можете думать о коде как о работающем:

if ($obj = NULL)

Это неверно, поэтому оператор (while в вашем случае) не оценивается.

person Explosion Pills    schedule 02.01.2014
comment
Приветствую вас, приятель, теперь становится более понятно, как работает array_shift в этом примере. Ценю, что вы нашли время, чтобы объяснить это. - person webdev; 03.01.2014