mysql çıkışından json verimli oluşturma - uniques içinde gruplama

4 Cevap php

Ben burada bazı verimsiz kod yazma olmuştur inanıyorum, ama bunu yazma, daha verimli bir şekilde anlamaya gibi olamaz.

Ben de bazı html veya xml çıkışı ile sorunu yaşadım ama bu genellikle, json çıkışı ile olur.

I run a query in my database which brings back an array. Say a persons favorite foods. php's mysql_fetch_assoc returns

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

Benim json veya html oluşturmak için, ben eşsiz kişiler arıyor döngü, ve sonra bu gibi gıda ekleyerek oldum

$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'];
}

Şimdi sadece mysql yanıt sürekli tekrarlanan tek bir değer varsa, bu büyük bir anlaşma değil, ama değerleri aynıdır 4 veya 5 sütun yaşamaya başlarsanız, oldukça ayrıntılı almaya başlıyor.

Bunu yapmak için daha iyi bir yolu var mı?

-------------Clarifying what the output should look like ----------------- The final json for the above arrays should look like this

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

[{"yiyecek": "meyan"}] gibi bir şey ya da susan "gıdalar" olurdu.

4 Cevap

Json_encode kullanılması:

$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);

Bu, aşağıdaki neden olmalıdır:

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

Umarım bu yardımcı olur

Bir kludge bir parçasıdır, ama biraz daha hızlı mysql'in yardım kullanarak aradığınız ne yapmak için bir yolu, bu sorguyu kullanmak için:

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

ve o size bir diziye bölebilirsiniz gıdalar için tek bir dize var

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

Bir kesmek biraz olsa bile, çok daha basit. Ayrıca, ben de kendi json haddeleme üzerinde json_encode kullanarak öneriyoruz. Benim php yüzden bu kod% 100 doğru olduğunu emin değilim ama o topu parkta bulunuyor paslı.

Değil mükemmel bir cevap, ama

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

Diğerleri kodlanmış çeşitli sürümleri vardır ama şimdi array2json yok. Sadece json_encode ($ dizi) kullanabilirsiniz; yakın ama doğru değil olurdu.

Nasıl kullanma hakkında php işlevi yerleşik json_encode()?

Ayrıca varsa otomatik olarak yerli php json fonksiyonunu kullanacağız Zend Framework adlı Zend_Json kullanabilir, ve değilse, kendi uygulama bulunuyor.