2012-12-19 2 views
12

Я не могу обмотать голову вокруг этого.Почему мой массив начинается с пустого значения?

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

Массив:

Array ( 

[0] => 

[1] => Value 1 

[2] => Value 2 

[3] => Value 3 

) 

Код:

$categories = array(); 
$query2 = mysql_query("SELECT * FROM books_categories"); 
do{ 
    array_push($categories, $category['description']); 
}while($category=mysql_fetch_assoc($query2)); 

Как я выполнить, чтобы получить первый элемент массива будет Значение 1?

+0

Я думаю, вы должны включить отчеты об ошибках и посмотреть, что случилось. –

+0

@AlvinWong - здесь ошибок не будет; это логическая проблема, а не проблема синтаксиса или запроса. – SDC

+1

@MrSlippyFist - в случае, если вам интересно, почему половина ответов говорит вам прекратить использование функций 'mysql_xx()', это потому, что они устарели и не рекомендуются для использования. См. [Почему я не должен использовать функции mysql_ * в PHP?] (Http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php) для получения дополнительной информации и того, что сделайте об этом. – SDC

ответ

21

Это происходит из-за попытки сделать в то время как цикл в то время как петля

while($category=mysql_fetch_assoc($query2)){ 
    array_push($categories, $category['description']); 
} 
+1

Ты самый быстрый и слишком быстрый. –

+1

Хотя рекомендуется сделать это: 'while (($ category = mysql_fetch_assoc ($ query2))! == false)'. Это позволит убедиться, что он не сбой при возникновении ошибки в запросе или отсутствии строк. –

+0

@Rune ваш бит '! == false' не нужен; если он равен false, он выйдет из цикла просто отлично с кодом в ответе, потому что '$ category' будет установлено в false, что закончит цикл while. – SDC

5

Потому что вы должны использовать время цикла вместо Do-While Loop.

while($category = mysql_fetch_assoc($query2)) { 
    array_push($categories, $category['description']); 
} 

В коде вместо в первой итерации цикла (при входе в блок сделать в первый раз), $category не установлен поэтому установка первое значение массива, чтобы быть пустым.

1

Попробуйте сделать это вместо:

$categories = array(); 
$query2 = mysql_query('SELECT * FROM books_categories'); 
while($r = mysql_fetch_array($query2)){ 
    $categories[] = $r['description']; 
} 
+0

@mauris - Кто-то здесь не любит пространства, я вижу :-) –

+0

пока я удалил 3 пробела, я добавил еще 4 пространства для отступов. Поскольку -3 + 4 = 1, вы можете сказать, что мне все еще нравятся пробелы. – mauris

+1

@maurius Я одобряю ваше уравнение и принимаю ваш ответ. Теперь вы можете улететь: D –

14

Ответ очень прост: вы толкая первый элемент, прежде чем прочитать первую строку. Правильный способ сделать это будет с предустановочным циклом:

$categories = array(); 
$query2 = mysql_query("SELECT * FROM books_categories"); 

while($category=mysql_fetch_assoc($query2)) { 
    array_push($categories, $category['description']); 
} 

И, пожалуйста, переключитесь на использование PDO.

5

Вы сначала записываете значение (array_push()) в массив, а затем вы фактически получаете значение (mysql_fetch_assoc()).

Вы должны первых получить значение и затем поместить его в массив!

$categories = array(); 
$query2 = mysql_query("SELECT * FROM books_categories"); 
while(($category = mysql_fetch_assoc($query2)) !=== false) { 
    array_push($categories, $category['description']); 
} 
12

Как во время цикла работы

enter image description here

Основное отличие от регулярных в то время как петли в том, что первая итерация делать-то время цикла гарантирует выполнение (выражение истина есть проверяется только в конце итерации), в то время как это может не обязательно выполняться с регулярным циклом while (выражение истинности проверяется в начале каждой итерации, если оно оценивает FALSE с самого начала, выполнение цикла немедленно прекращается). source

поэтому в вашей программе произошло то, что вы нажимаете на первый элемент, прежде чем читать первую строку.

так использовать, а вместо

, что заманивать цикл будет делать?как и в схеме он будет проверять первым, чем прийти внутри тела цикла, чтобы элемент толчок после того, как прочитал первую строку

$categories = array(); 
$query2 = mysql_query("SELECT * FROM books_categories"); 

while($category=mysql_fetch_assoc($query2)) { 
    array_push($categories, $category['description']); 
} 

Примечание

  1. Весь ext/mysql расширение РНР, который предоставляет все функции с именем prefix mysql_, равно officially deprecated as of PHP v5.5.0 и будет удалено в будущем. Так что используйте либо PDO или MySQLi

Хорошо прочитать

  1. The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead
+4

Лучший ответ. У него есть блок-схема, текстовое объяснение, в нем упоминается устаревание API ... что еще вам нужно? – Zecc

Смежные вопросы