problema con funzione ordinamento dati

ciao,

ho una funzione che mi estrae in una combo le categorie.

se le ordino con ORDER BY cat_id, mi visualizza tutte le categorie, ma se le ordino BY cat_name ne perdo alcune.

per esempio, se ho categorie che vanno da A-Z, ORDER BY cat_name inizia a contarmele da C.

La query funziona, l'ho provata quindi dev'esserci qualcosa nella funzione che non va

posto il codice:

function buildCategoryOptions($catId = 0)
{
    $sql = "SELECT cat_id, cat_parent_id, cat_name
            FROM tbl_category
            ORDER BY cat_name";
    $result = dbQuery($sql);

    $categories = array();
    while($row = dbFetchArray($result)) {
        list($id, $parentId, $name) = $row;

        if ($parentId == 0) {
            // we create a new array for each top level categories
            $categories[$id] = array('name' => $name, 'children' => array());
        } else {
            // the child categories are put int the parent category's array
            $categories[$parentId]['children'][] = array('id' => $id, 'name' => $name);
        }
    }

    // build combo box options
    $list = '';
    foreach ($categories as $key => $value) {
        $name     = $value['name'];
        $children = $value['children'];

        $list .= "<optgroup label=\"$name\">";

        foreach ($children as $child) {
            $list .= "<option value=\"{$child['id']}\"";
            if ($child['id'] == $catId) {
                $list.= " selected";
            }

            $list .= ">{$child['name']}</option>\r\n";
        }

        $list .= "</optgroup>";
    }

    return $list;
}
inviato 9 anni fa
iTek
iTek
1
X 0 X

L'errore è alquanto subdolo e si verifica quando la query restituisce prima un "children" e poi il suo "parent"

Nel ciclo WHILE viene prima processato il "children" con la seguente istruzione:

$categories[$parentId]['children'][] = array('id' => $id, 'name' => $name);

successivamente viene processato il "parent" del "children" di prima, con questa istruzione:

$categories[$id] = array('name' => $name, 'children' => array());

E' chiaro che questa seconda assegnazione va a sovrascrivere la prima facendo perdere le tracce del "children"

 :bye:

risposto 9 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda

Domande simili