Цикл Foreach возвращает только первый результат

#php #arrays #multidimensional-array

#php #массивы #многомерный массив

Вопрос:

У меня проблема с отображением всех результатов в foreach в отношении массива php.

Я написал sql-запрос и хочу, чтобы он выполнял цикл по всем значениям, возвращая результаты для каждого из них.

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

     $cookies = array();
    $cookies[] = 'Chocolate';
    $cookies[] = 'Vanilla';
    $cookies[] = 'Stracciatella';

    $ar = [];
    foreach ($cookies as $cookie => $value) {
        $results = $this->getEntityManager()->getConnection()->executeQuery(
            "SELECT * FROM sweets WHERE cookies LIKE :cookies",
            ['cookies' => '%"' . $value . '"%']
        );
    }
    foreach ($results as $result) {
         $ar[] = $result;
    }
  return $ar;
  

Я создал эти теги, поскольку проблема связана не с запросом, а с циклом foreach.

Комментарии:

1. В настоящее время вы переписываете $results переменную на каждой итерации

2. $ar[] = $this->getEntityManager()->getConnection()->executeQuery(…); в первом цикле и прочь со второго цикла … (который в настоящее время даже не работает, потому что $results не является массивом и в любом случае был бы лишним, потому что вы можете легко выполнить обе вещи в одном цикле.)

Ответ №1:

В настоящее время вы переписываете $results переменную на каждой итерации вашего первого foreach цикла. Вы захотите добавить свои результаты к другой переменной, чтобы затем выполнить итерацию или вместо этого просто сократить до одного foreach цикла.

     $cookies = array();
    $cookies[] = 'Chocolate';
    $cookies[] = 'Vanilla';
    $cookies[] = 'Stracciatella';

    $results = [];
    foreach ($cookies as $cookie => $value) {
        $results[] = $this->getEntityManager()->getConnection()->executeQuery(
            "SELECT * FROM sweets WHERE cookies LIKE :cookies",
            ['cookies' => '%"' . $value . '"%']
        );
    }
    return $results;
  

Чтобы избежать обновления этого и не выполнить то, что вы ищете, я приведу здесь несколько дополнительных рабочих процессов, которые вы можете выбрать и адаптировать по своему вкусу. Я не уверен, какую CMS вы используете, поэтому я предполагаю, что он возвращает PDOStatement здесь, поэтому я могу вызвать fetch()

Чтобы получить количество файлов cookie, которые соответствуют $value

 $cookies = ['Chocolate', 'Vanilla', 'Stracciatella'];
$counts = array_fill_keys($cookies, 0);
foreach ($cookies as $cookie => $value) {
    $counts[$cookie] = $this->getEntityManager()->getConnection()->executeQuery(
        "SELECT COUNT(*) FROM sweets WHERE cookies LIKE :cookies",
        ['cookies' => '%"' . $value . '"%']
    )->fetch();
}
  

Чтобы получить данные cookie и подсчитать результаты:

 $cookies = ['Chocolate', 'Vanilla', 'Stracciatella'];
$sweets = []; // previously $results
$counts = array_fill_keys($cookies, 0);
foreach ($cookies as $cookie => $value) {
    $sweet = $this->getEntityManager()->getConnection()->executeQuery(
        "SELECT * FROM sweets WHERE cookies LIKE :cookies",
        ['cookies' => '%"' . $value . '"%']
    );
    $sweets[] = $sweet;
    $counts[$cookie]  = 1;
}

// This gives you:
print_r($sweets); // the data
print_r($counts); // the counts
  

Комментарии:

1. Большое спасибо! У меня только один вопрос? Как я могу разделить результаты, поскольку все они находятся в массиве $results? @Reece

2. Что вы подразумеваете под «отдельным»? Вы хотите иметь 2 переменные с одинаковыми данными, одну для сохранения и одну для манипулирования / редактирования?

3. Я хочу извлечь данные для каждого из «вкусов», чтобы я мог считать их отдельно. @Reece

4. Извините, если я неправильно интерпретирую, но если вы хотите подсчитать количество сладостей, связанных с $value (вкусом, я полагаю?), То вы хотели бы использовать COUNT(*) в своем запросе. В противном случае, если вам нужны как количество, так и данные, вы можете сохранить их в многомерном массиве. Я могу привести пример для последнего, если это предпочтительнее?

5. Ты босс. 🙂 Я просто хочу «попробовать» с номером счета. 🙂 @Reece