эффективное создание json из вывода mysql - группировка по уникальным - PullRequest
2 голосов
/ 22 декабря 2009

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

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

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

Array([person]=>john [food]=>chocolate)
Array([person]=>john [food]=>pizza)
Array([person]=>john [food]=>coffee)
Array([person]=>susan [food]=>licorice)

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

$jsonOut=''
$personAdd='';
while($gotArray=mysql_fetch_assoc(foodArray)){

if($personAdd!='$gotArray['person']){
$jsonOut.="person: $gotArray['person'], foods{";
}
$jsonOut.="food:$gotArray['food'],";
rtrim(jsonOut,',');
$jsonOut.="}";
$personAdd=$array['person'];
}

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

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

------------- Уточнение, как должен выглядеть вывод ----------------- Окончательный JSON для вышеуказанных массивов должен выглядеть следующим образом:

[
    {
        "person": "john",
        "foods": [
            {
                "food": "chocolate",
                "food": "pizza",
                "food": "coffee" 
            } 
        ] 
    },
    {
        "person": "susan",
        "food": "licorice" 
    }
]

, иначе у Сьюзен будут "продукты": [{"food": "солодка"}] что-то в этом роде.

Ответы [ 4 ]

5 голосов
/ 23 декабря 2009

Использование 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'
    ]
}

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

1 голос
/ 23 декабря 2009

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

0 голосов
/ 22 декабря 2009

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

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

0 голосов
/ 22 декабря 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...