У меня есть меню. Каждое блюдо имеет категорию, как говядина, свинина, курица, салат. Теперь я хочу получать каждую еду, разделять их по категориям и сохранять в массиве. Так что у меня есть для каждой категории Массив с едой. Последним шагом будет подсчет количества блюд в каждой категории, но это легко, когда я там.
Моя нынешняя попытка очень плохая. Я делаю mysql_query
с фильтром для каждой отдельной категории и секундой для подсчета наборов данных. Так что у меня к одной категории два запроса. Если в конце у меня будет 30 категорий, сервер должен обработать 60 запросов для одного просмотра страницы.
for($i=0; $i < $30; $i++)
{
$fetchMeal="SELECT * FROM Menu WHERE Categorie = '$categorie[$i]'";
$countMeals = mysql_query("SELECT count(*) from Menu WHERE Categorie = '$categorie[$i]'");
}
Я хочу, чтобы только один извлекал все наборы данных, разбивал их по категориям и считал наборы данных в этих категориях. Кто-нибудь знает хороший и простой способ сделать это?
Пример таблицы:
name | categorie
-----------------------
tomato-salad | salads
potatotfish | fish
peppersteak | beef
schnitzel | pork
ceasar-salad | salad
another-fish | fish
fish-fish | fish
roast pork | pork
так далее…
теперь я хочу иметь массивы для каждой категории:
salads[0] -> tomato-salad
salads[1] -> ceasar-salas
fish[0] -> potatofish
fish[1] -> another-fish
fish[2] -> fish-fish
beef[0] -> peppersteak
pork[0] -> schnitzel
pork[1] -> roast pork
Вам нужно ORDER BY
ваша категория. Что-то вроде:
SELECT * FROM menu
ORDER BY categorie, name
Затем вы можете прочитать их в массив PHP. Еще один способ сделать это, чтобы упростить группирование по категориям, это сделать это:
SELECT DISTINCT categorie FROM menu
Затем переберите результаты и делайте это каждый раз:
SELECT * FROM menu WHERE categorie = $categorie
Лично я бы сделал первый, так как вы можете захватить категорию, а затем просто поместить элементы в массив следующим образом:
$meals[$categorie][] = $name;
Вы упоминаете, что недовольны 60 запросами на страницу. В вашем случае это является неэффективно, но 60 запросов само по себе не обязательно плохо. Имейте в виду, что учитывается общее время выполнения, а не количество запросов. Иногда разбить проблему на несколько небольших запросов можно быстрее, чем один большой.
Мое решение теперь, когда я упорядочиваю наборы данных по их категориям. Если я echo
с результатами это должно выглядеть так:
category | meal
---------+----------
fish | cookes fish
fish | potato-fish
fish | fish-fish
fish | another-fish
pork | roast pork
pork | schnitzel
beef | peppersteak
salad | tomato-salad
salad | ceasar-salad
salad | another-salad
Затем вы должны узнать, сколько у вас категорий. Поскольку у меня есть названия категорий в другой таблице, я могу сосчитать их с помощью:
$result = mysql_query("SELECT count(*) from categories");
$NumberOFCategories = mysql_result($result, 0);
Если у вас нет дополнительной таблицы, вы должны сделать этот запрос:
SELECT DISTINCT categorie FROM menu
и посчитайте ваши полученные наборы данных с помощью PHP foreach
петля. Затем я сохранил каждый набор данных в массиве с foreach
петля.
$i = 0 //counter
$menu = array();
while($tabellenInhalt = mysql_fetch_object($erg))
{
$menu[$i][0]=$tabellenInhalt -> Category ;
$mneu[$i][1]=$tabellenInhalt -> Meal;
$i = $i+1;
}
Теперь наступает сложная часть. Вы сохраняете первую категорию в переменной держателя. И создайте переменную для счетчика, которая понадобится вам позже в foreach
петля.
Затем вы создаете цикл for, который содержит столько категорий, сколько у вас есть (вы получили номер в начале). После этого вы делаете foreach
Цикл вашего массива, пока переменная-держатель и категория равны. Я показываю вам мой код:
$m = 0; //counter for every dataset
$j = 0; //counter for the datasets in a category
$holder = $menu[$m][0]; //holds the actual/next category
$splittedMenu = array();
for($n = 0; $n < $NumberOfCategories; $n++) //Count three every company
{
while($menu[$m][2] == $halter) //test if Category is still the same.
{
$splittedMenu [$n][$j][0] = $menu[$m][0];
$splittedMenu [$n][$j][1] = $menu[$m][1];
$m = $m + 1; //count threw all datasets
$j = $j + 1; // count threw all datasets from one category.
}
$j = 0; //counter gets resetted when the next category gets called.
$halter = $splittedMenu [$m][2]; //go to next category
}
Теперь ваше первое измерение массива разделяет категории. Второе измерение относится к вашей еде, а в третьем хранятся разные данные (название категории и название еды).