2011-01-11 22 views
8

sto ottenendo alcuni dati da un database e sto codifica a JSON:php json_encode è la codifica lo stesso dato due volte

$json = ""; 
if($result = $dbc->query($query)) { 
    $num = $result->num_rows; 
    for($i = 0; $i < $num; $i++) { 
     $row = $result->fetch_array(); 
     $json .= json_encode($row); 
     if($i != ($num-1)) { 
     $json .= ','; 
     } 
    } 
} 

ma invece di ottenere la stringa json nel formato:

{"name:"joe", "age":"22", "etc":"etc"} 

Ricevo ogni valore duplicato perché mi sta dando il nome dell'elemento sia come indice di un array associativo che non associativo. Quindi sto ricevendo:

{"0":"joe", "name":"joe", "1":"22", "age":"22", "3":"etc", "etc":"etc"} 

Mentre posso ancora usare il json. È ancora il doppio delle dimensioni che voglio che sia e quindi non efficiente. Posso comunque ottenere il metodo json_encode per darmi solo gli array associativi come tag JSON? (Parole sbagliate per descrivere queste cose senza dubbio)

Molte grazie

risposta

24

Questo perché si sta utilizzando fetch_array() (sottolineatura mia):

mysqli_fetch_array() è una versione estesa del mysqli_fetch_row() funzione. Oltre a memorizzare i dati negli indici numerici dell'array dei risultati, la funzione mysqli_fetch_array() può anche memorizzare i dati negli indici associativi, utilizzando i nomi dei campi del set di risultati come chiavi.

Utilizzare invece fetch_assoc().

+0

Bella spiegazione, grazie mille Pekka – Joe

+0

Ho appena realizzato di aver creato array con contenuti duplicati per anni perché ho sempre utilizzato mysql_fetch_array(). – andreszs

3

Basta cambiare $row = $result->fetch_array();-$row = $result->fetch_assoc();

+1

Perché il downvote? Questo è perfettamente corretto. +1 per pareggiare –

+0

Probabilmente perché è una risposta ridondante (della tua) e offre meno informazioni. Penso che l'essenza di questo sito non sia solo dare risposte, ma dare una piccola spiegazione per farlo. Nessuno impara nulla se non capiscono cosa stavano facendo di sbagliato, o perché è sbagliato. – ken

3

Pekka ha probabilmente ragione, ma vorrei aggiungere che si stanno facendo più lavoro per te stesso chiamando json_encode() per ogni riga. E 'probabilmente meglio costruire la struttura dei dati, e quindi chiamata json_encode() su quella:

$rows = array(); 
if ($result = $dbc->query($query)) { 
    $num = $result->num_rows; 
    for ($i = 0; $i < $num; $i++) { 
     $rows[] = $result->fetch_assoc(); 
    } 
} 
$json = json_encode($rows); 

marcatura wiki comunità come questo è un suggerimento sulla pratica e non una risposta .

+0

Ottimo punto! –

+0

Sfortunatamente, anche con funzioni native come 'json_encode()', gli sviluppatori stanno ancora cercando di risolvere il problema della costruzione manuale di una stringa JSON. Lo vedo sempre, succede anche in JavaScript - la gente non si rende conto che esiste un 'JSON.stringify()' che i browser moderni forniscono in modo nativo (e che può essere scaricato da json.org per supportare utenti senza browser moderni). – ken

+0

Grazie mille per aver reso quel punto Ken. La tua strada sembra molto più facile e più pulita. :) – Joe

Problemi correlati