Я считаю, что я писал здесь неэффективный код, но, похоже, не могу найти более эффективного способа его написания.
Это часто происходит с выходом 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, если она доступна, а если нет, это собственная реализация.