Nano Hash - криптовалюты, майнинг, программирование

эффективное создание json из вывода mysql - группировка в пределах уникальности

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

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

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

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

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

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

22.12.2009

  • Предполагая, что он был отсортирован в порядке, в котором он должен быть сжат, рекурсивная функция должна иметь возможность создавать рекурсию array2json для дубликатов. Может быть, кто-то создаст его для вас с щедростью. 22.12.2009

Ответы:


1

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

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

23.12.2009
  • Спасибо К Прайм. Похоже, это, вероятно, способ сделать это. Не ОГРОМНОЕ улучшение по сравнению с тем, что у меня есть, но определенно улучшение. Более лаконичный и понятный. Но я подумал, что, может быть, есть лучший способ. 24.12.2009

  • 2

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

    23.12.2009
  • спасибо, Роб, вы правильно используете GROUP_CONCAT в этом примере. Для очень простых пользователей я думаю, что GROUP_CONCAT будет работать хорошо. По мере того, как все становится глубже, а запросы становятся больше, я не уверен. Но вы получаете балл за нестандартное мышление. 24.12.2009
  • Я согласен, это не очень хорошее решение для сложных запросов. Во-первых, разделение очень наивно, поэтому вам лучше не ставить запятую в ваших значениях. Кроме того, у group_concat есть верхние ограничения на длину, которые возникают при больших наборах значений. 24.12.2009

  • 3

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

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

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

    22.12.2009
  • Я попробовал это, но в итоге я получаю повторяющиеся значения на выходе. Так что я не получаю Человек:Джон, еда {еда:шоколад, еда:пицца.... Я получаю {Человек:Джон, еда:шоколад}, {Человек: Джон, еда: пицца},... 22.12.2009

  • 4

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

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

    22.12.2009
  • json_encode будет кодировать каждый возвращаемый массив как json. Если я не использую его неправильно, он не группирует похожие свойства, как я указал в выводе, который я ищу. 23.12.2009
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..