2013-06-10 4 views
3
$category = array(
    "Alpha", 
    "Beta", 
    "Gamma", 
    "Delta", 
    "Epsilon", 
    "Zeta" 
); 
for ($count = 0; $count < 5; $count++) { 

    $query = "SELECT * FROM random_walk WHERE category = '$category[$count]'"; 
    $result = $mysqli->query($query) or die($mysqli->error . __LINE__); 
    $row_cnt = $result->num_rows; 

    if ($result->num_rows > 0) { 
     $row_counter = 0; 

     while ($row = $result->fetch_assoc()) { 
      $category[$count][$row_counter] = $row['image_filename']; 
      $row_counter++; 

      echo $category[$count][$row_counter]; 
     } 
    } 
} 

Я пытаюсь хранить данные строки MySQLi $ в массиве PHP 2 размером $category[][].

Я инициализировал массив с именем $category, который содержит имена категорий, которые я хочу использовать. Теперь я хочу получить записи из моей базы данных и сохранить содержимое поля записи image_file (например, poly_interpolated.jpg) во второе измерение и цикл, пока в базе данных больше нет файлов изображений для этой категории.

Однако, когда я эхо-массив, я вижу только один символ, который не является тем, что я ожидал увидеть вообще, поскольку $row['image_file'] возвращает имя файла из нескольких символов в длину. Я бы подумал, что $category[$count][$row_counter] = $row['image_filename']; сохранит имя файла, но кажется, что я в некотором роде от этого допущения.

Может кто-нибудь, пожалуйста, взгляните на приведенный выше код и укажите мне в правильном направлении?

+0

Вы повторно используете переменную '$ category', это намеренно? Я чувствую, что это вызовет множество ошибок, поскольку вы уже используете точное имя для цикла. –

+0

Это намеренно, поскольку имя массива относится к полю категории в базе данных (хотя это не означает, что я не могу изменить имя массива, если в вашем опыте вы чувствуете, что это может привести к ошибке). – user2457571

ответ

4

Это то, что вы ищете.

Некоторая проницательность - вы видите только один символ, потому что у вас нет многомерного массива. У вас есть одномерный массив строк, и когда вы обращаетесь к индексу этих строк, вы получаете символ в строке.

Вам нужен ассоциативный массив ключей, представляющих массивы.

Я добавил другой код, чтобы объединить ваши поиски в один поиск с предложением IN, поэтому он сделает что-то вроде WHERE category IN ('Alpha', 'Beta', etc.). Это будет намного быстрее.

Наконец, для каждой записи вы хотите добавить ее в массив категорий с соответствующим индексом. Это сортирует ваши данные в коллекции категорий.

О, также нет необходимости в счетчике строк. Просто добавив строку в конец своей категории, она будет правильно индексировать ее в массиве.

$category = array(
    "Alpha" => array(), 
    "Beta" => array(), 
    "Gamma" => array(), 
    "Delta" => array(), 
    "Epsilon" => array(), 
    "Zeta" => array() 
); 

// Concatenate the categories for searching 
$categories = array_keys($category); 
for ($i = 0; $i < count($categories); $i++) { 
    $categories[$i] = "'{$categories[$i]}'"; 
} 
$categories = implode(",", $categories); 

// Query on an IN clause 
$query = "SELECT * FROM random_walk WHERE category IN ({$categories})"; 
$result = $mysqli->query($query) or die($mysqli->error . __LINE__); 
$row_cnt = $result->num_rows; 

if ($result->num_rows > 0) { 
    while ($row = $result->fetch_assoc()) { 
     $category[$row['category']][] = $row['image_filename']; 
     echo $category[$row['category']][count($category[$row['category']]) - 1]; 
    } 
} 
+0

+1 для перемещения этого запроса за пределы цикла и объяснения того, что происходит, когда строка рассматривается как массив. –

+0

Супер! Спасибо, Стивен. Большое спасибо за код, объяснение и указатели. – user2457571

+0

Он работал как шарм ... Я чуть не повинился. PS Ожидание 15 репутации! – user2457571

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