многомерный массив возвращает неверные результаты с foreach - PullRequest
3 голосов
/ 22 июня 2011

У меня есть класс php, который взаимодействует с базой данных mysql, а затем извлекает массив в результате.

$res = $db->getResult(); // $res is an array

Я использую его с print_r:

print_r($res);

, и он выводит это:

Array
(
    [0] => Array
        (
            [id] => 1
            [firstname] => Mohamed
            [lastname] => Kadri
        )

    [1] => Array
        (
            [id] => 2
            [firstname] => Slim
            [lastname] => Nejmaoui
        )

    [2] => Array
        (
            [id] => 3
            [firstname] => Sameh
            [lastname] => Chraiti
        )

И с foreach:

foreach ($res as $row) {
    echo $row['id'] . ' ' . $row['firstname'] . ' ' . $row['lastname'] . '<br />';
}

это выводит это:

1 Mohamed Kadri
2 Slim Nejmaoui
3 Sameh Chraiti

, но когда есть только одна строка, это показывает:

1 1 1
M M M    
K K K

(1 - это идентификатор, M - это первая буква в имени, а K - первая буква в фамилии).

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

Так что я должен сделать условие для обработкиодин из двух типов foreach?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 22 июня 2011

Да, похоже, именно это и происходит.Скорее всего, $db->getResult() возвращает результирующую строку в виде массива (не вложенных массивов в результате), когда из запроса возвращается только одна строка.Итак, вам нужно определить, есть ли вложенные массивы, и правильно обработать:

if (isset($res[0]) && is_array($res[0])){
    foreach ($res as $row) {
        echo $row['id'] . ' ' . $row['firstname'] . ' ' . $row['lastname'] . '<br />';
    }
}else{
    echo $res['id'] . ' ' . $res['firstname'] . ' ' . $res['lastname'] . '<br />';
}
2 голосов
/ 22 июня 2011

очевидно, ваш db-объект возвращает один массив, когда у вас есть только один результат, похожий на этот:

Array
(
    [id] => 2
    [firstname] => Slim
    [lastname] => Nejmaoui
)

вы можете проверить первый ввод, и если это не массив, не проходите цикл через foreach, иначесделать foreach

if( is_array(current($res)) ){
  // do the foreach...
}else{
  echo $res['id'] . ' ' . $res['firstname'] . ' ' . $res['lastname'] . '<br />';
}

Я думаю, что вы должны изменить свой класс БД, чтобы всегда возвращать вложенный массив даже для результата из одной строки, чтобы сохранить согласованность результатов.

1 голос
/ 22 июня 2011

Вы перебираете одну строку результатов в случае, который вам неясен.

То, что вам остается незамеченным, это то, что $row содержит только скалярные значения:

  1. 1 (int)
  2. Mohamed (строка)
  3. KadriK (строка)

Это содержимое для $row уже вкаждая итерация (1-3).

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

Каквсе неопределенности 'id', 'firstname' и 'firstname' интерпретируются как константы, которые все не определены и приводят к 0, вы фактически получаете доступ к первому символу / байту в строке: 1, M иK.

В более новой версии PHP 1 даже не будет возвращено.

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

PHP Notice:  Use of undefined constant Kadri - assumed 'Kadri' in ...

Быстрая настройка может быть выполненадобавив это:

  error_reporting(-1);
  ini_set('display_errors', 1);
1 голос
/ 22 июня 2011

Вы используете CodeIgniter?Потому что похоже, что ты есть.В CodeIgniter, когда есть только один результат, он возвращает только один массив.

Мое предложение?Создайте функцию поддержки (do_something_with_row ниже) и затем вызовите ее условно:

if(count($res) > 1)
{
    foreach($res as $row)
    {
        do_something_with_a_row($row);
    }
}
else
{
    do_something_with_a_row($res);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...