#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