PHP цикл foreach дважды - PullRequest
       16

PHP цикл foreach дважды

1 голос
/ 29 декабря 2010

Я пытаюсь просмотреть некоторые данные из моей базы данных, но выводит их дважды.

$fields = 'field1, field2, field3, field4';
$idFields = 'id_field1, id_field2, id_field3, id_field4';
$tables = 'table1, table2, table3, table4';
$table = explode(', ', $tables);
$field = explode(', ', $fields);
$id = explode(', ', $idFields);
$str = 'Egg';

$i=0;

while ($i<4) {  
    $f = $field[$i];
    $idd = $id[$i];
    $sql = $writeConn->select()->from($table[$i], array($f, $idd))->where($f . " LIKE ?", '%' . $str . '%');
    $string = '<a title="' . $str . '" href="' . $currentProductUrl . '">' . $str . '</a>';
    $result = $writeConn->fetchAssoc($sql); 

        foreach ($result as $row) {
            echo 'Success! Found ' . $str . ' in ' . $f . '. ID: ' . $row[$idd] . '.<br>';
        }
    $i++;
}

Выведение:

Успех! Яйцо найдено в поле3. ID: 5.
Успех! Яйцо найдено в поле3. ID: 5.

Может кто-нибудь объяснить, почему он проходит по индексируемым и ассоциативные значения?

UPDATE

Я еще немного поиграл и попробовал следующее.

$fields = 'field1, field2, field3, field4';
$idFields = 'id_field1, id_field2, id_field3, id_field4';
$tables = 'table1, table2, table3, table4';
$table = explode(', ', $tables);
$field = explode(', ', $fields);
$id = explode(', ', $idFields);
$str = 'Egg';

$i=0;

while ($i<4) { 
    $f = $field[$i];
    $idd = $id[$i];
    $sql = $writeConn->select()->from($table[$i], array($f, $idd))->where($f . " LIKE ?", '%' . $str . '%');
    $string = '<a title="' . $str . '" href="' . $currentProductUrl . '">' . $str . '</a>';
    $sth = $writeConn->prepare($sql);
    $sth->execute();
    $result = $sth->fetch(PDO::FETCH_ASSOC);

        foreach ($result as $row) {
            echo 'Success! Found ' . $str . ' in ' . $f . '. ID: ' . $row[$idd] . '.<br>';
        }
    $i++;
}

Интересно то, что это выдает следующее:

Успех! Яйцо найдено в поле3. ID: E.
Успех! Яйцо найдено в поле3. ID: E.
Успех! Яйцо найдено в поле3. ID: 5.
Успех! Яйцо найдено в поле3. ID: 5.
Успех! Яйцо найдено в поле3. ID: E.
Успех! Яйцо найдено в поле3. ID: E.
Успех! Яйцо найдено в поле3. ID: 5.
Успех! Яйцо найдено в поле3. ID: 5.

Я также попытался добавить $i к выводу, и это выдает 2, как и ожидалось. Если я изменю fetch(PDO::FETCH_BOTH) на fetch(PDO::FETCH_ASSOC), вывод будет следующим:

Успех! Яйцо найдено в поле3. ID: E.
Успех! Яйцо найдено в поле3. ID: E.
Успех! Яйцо найдено в поле3. ID: 5.
Успех! Яйцо найдено в поле3. ID: 5.

Это слишком долго беспокоило меня, поэтому, если кто-то мог помочь, я был бы очень признателен!

Ответы [ 2 ]

1 голос
/ 29 декабря 2010

Вероятно, fetchAssoc() возвращает массив с цифровыми (0 ~ n) и строковыми (имя столбца) ключами.См. PDO::FETCH_BOTH на странице документации PDOStatement :: fetch () .

Добавление: И причина этого та же, почему fetchAssoc() возвращает двойной массив по умолчанию:PHP не делает различий между числовыми и строковыми индексированными массивами;Вы можете использовать любой из них.

0 голосов
/ 01 июня 2012

Забудьте все сложные объяснения. Ваша проблема вызвана использованием echo () внутри этого цикла. У меня была та же проблема (см. Ниже), когда цикл foreach запускался дважды без видимой причины.

Если вы хотите предоставить информацию из своего PHP-кода для целей тестирования, создайте текстовую строку и добавьте в нее такие вещи, как:

$result .= "<br>And then this thingy did those stuff";

Если вы сделаете это и только отобразите результат $ в конце процесса, вы обнаружите, что ваша проблема исчезла.

Функция echo () смешивается с чувством выполненного долга PHP квантовым способом: вы чувствуете, что он одновременно уже выполнил ваш код, и как будто он еще не запущен. Я не могу объяснить детали, но результат довольно странный.

МОЯ ПРОБЛЕМА КАК ЭТО БЫЛО: У меня та же проблема с другой настройкой foreach. В моем случае массив получен из URL-адреса HTTP-запроса:

// myfakeserver / Функции / dealWithIncomes.php я = {% 220% 22: {22% amount%22:332,%22T1%22:%22month%22,%22M1%22:1,%22T2%22 :% 22dayofmonth% 22% 22М2% 22: 20,% 22T3% 22:% 22% 22% 22М3% 22: 0,% 22S1% 22:% 22% 22% 22E1% 22:% 22% 22} ,% 221% 22: {22% amount%22:444,%22T1%22:%22week%22,%22M1%22:1,%22T2%22:%22dayofweek%22,%22M2%22:1,%22T3 % 22:% 22% 22% 22% 22М3: 0,% 22S1% 22:% 22% 22% 22E1% 22:% 22% 22},% 222% 22: {22% amount%22:443,% 22T1% 22:% 22year% 22% 22M1% 22: 1,% 22T2% 22:% 22% 22% 22М2% 22: 0,% 22T3% 22:% 22% 22% 22М3% 22: 0, % 22S1% 22:% 222012-02-29% 22% 22E1% 22:% 22% 22}}

$comes = json_decode ($ _ GET ['i'], true);

Другими словами, строка JSON, представляющая три дохода и их свойства, такие как сумма и шаблон повторения.

PHP очень хорошо понимает эту строку как массив: sizeof ($comes) возвращает 3.

Но когда я перебираю эту штуку ...

foreach ($ доход как $ доход) { $ result. = "Работа с одним доходом от массива с длиной". SizeOf ($ доходы); }

... я понимаю ... "Работа с одним доходом от массива длиной 3" "Работа с одним доходом от массива длиной 3" "Работа с одним доходом от массива длиной 3" "Работа с одним доходом от массива длиной 3" "Работа с одним доходом от массива длиной 3" "Работа с одним доходом от массива длиной 3"

...