эффективное создание json из вывода mysql – группировка в uniques

Я считаю, что я писал здесь неэффективный код, но, похоже, не могу найти более эффективного способа его написания.

Это часто происходит с выходом json, хотя у меня была проблема с некоторыми выводами html или xml.

Я запускаю запрос в моей базе данных, который возвращает массив. Скажите людям любимые блюда. Возврат php mysql_fetch_assoc

 
 Массив ([человек] => Джон [еда] => шоколад)
 Массив ([человек] => Джон [еда] => пицца)
 Массив ([человек] => Джон [еда] => кофе)
 Массив ([человек] => сусан [еда] => лакрица)

Чтобы создать мой json или html, я зациклился на поиски уникальных людей, а затем добавил пищу, подобную этой

 $ JsonOut = ''
 $ PersonAdd = '';
 в то время как ($ gotArray = mysql_fetch_assoc (foodArray)) {

 если ($ personAdd! = '$ gotArray [' человек ']) {
 $ jsonOut. = "person: $ gotArray ['person'], продукты {";
 }
 $ JsonOut = "пища: $ gotArray [ 'пища'],".
 RTRIM (jsonOut, '');
 $ JsonOut = "}".
 $ PersonAdd = $ массив [ 'человек'];
 }

Теперь это не имеет большого значения, когда у вас есть только одно значение, которое постоянно повторяется в ответе mysql, но когда вы начинаете иметь 4 или 5 столбцов, где значения одинаковы, он начинает становиться довольно многословным.

Есть лучший способ сделать это?

————- Уточнение, как должен выглядеть вывод —————– Окончательный json для вышеуказанных массивов должен выглядеть так:

 [
     {
         «человек»: «Джон»,
         «продукты»: [
             {
                 «еда»: «шоколад»,
                 «еда»: «пицца»,
                 «еда»: «кофе» 
             } 
         ] 
     },
     {
         «человек»: «сусан»,
         «еда»: «солодка» 
     }
 ]

или сусан будет иметь «продукты»: [{«еда»: «солодка»}] нечто подобное.

Использование json_encode:

$persons = array (); while ($row = mysql_fetch_assoc($result)) { if (empty($persons[$row['person']])) $persons[$row['person']] = array (); array_push ($persons[$row['person']], $row['food']); } echo json_encode ($persons); 

Это должно привести к следующему:

 { 'john': [ 'chocolate', 'pizza', 'coffee' ], 'susan': [ 'licorice' ] } 

Надеюсь это поможет

Это немного клопик, но один способ сделать то, что вам нужно немного быстрее, используя помощь mysql, – использовать этот запрос:

 SELECT person, GROUP_CONCAT(food) AS foods FROM table GROUP BY person 

а затем у вас есть одна строка для продуктов, которые вы можете разделить на массив

 $persons = []; while($person = mysql_fetch_assoc(foodArray)){ $person['foods'] = explode(", ", $person['foods']); array_push($persons, $person); } $jsonOut = json_encode($persons); 

Гораздо проще, даже если это немного взломать. Кроме того, я также рекомендовал бы использовать json_encode для перетаскивания собственного json. Мой php ржавый, поэтому я не уверен, что этот код на 100% правилен, но он находится в парке.

Не идеальный ответ, но

 $array = array(); while($gotArray=mysql_fetch_assoc(foodArray)){ $array[] = $gotArray; }; $jsonOut = array2json($array); в $array = array(); while($gotArray=mysql_fetch_assoc(foodArray)){ $array[] = $gotArray; }; $jsonOut = array2json($array); 

Теперь array2json не существует, хотя есть несколько версий, закодированных другими. Вы можете просто использовать json_encode ($ array); который был бы близким, но не правильным.

Как насчет использования встроенной функции php json_encode () ?

Вы также можете использовать Zend_Json из Zend Framework, который будет автоматически использовать встроенную функцию php json, если она доступна, а если нет, это собственная реализация.