2009-05-24 7 views
0

I ont une table de base de données qui me donne le résultat suivant:tableaux de tri dans un tableau multidimensionnel par clé

array(8) { 
    ["link_id"]=> 
    string(2) "20" 
    ["link_url"]=> 
    string(56) "http://url.of/website" 
    ["link_name"]=> 
    string(34) "Website title" 
    ["link_target"]=> 
    string(0) "" 
    ["link_description"]=> 
    string(0) "" 
    ["link_updated"]=> 
    string(19) "2009-05-24 16:51:04" 
    ["taxonomy_id"]=> 
    string(2) "36" 
    ["term_id"]=> 
    string(2) "34" 
    ["category_name"]=> 
    string(15) "Link category" 
} 

Je veux trier un grand nombre de ces tableaux pour un tableau multidimensionnel, en fonction de la catégorie _ nom clé, puis triés par le lien _ mis à jour clé.

Je veux finalement à ressembler à ceci:

array(2) { 
    ["First category"]=> 
    array(2) { 
     ["link_name"]=> 
     string(11) "Newest link" 
     ["link_updated"]=> 
     string(19) "2009-05-24 16:51:24" 
    } 
    ["Second category"]=> 
    array(2) { 
     ["link_name"]=> 
     string(10) "Older link" 
     ["link_updated"]=> 
     string(19) "2009-05-20 05:32:56" 
    } 
} 

Je ne sais pas comment faire cela, mais je pense que je dois faire ma propre méthode de tri (de usort())?

EDIT: Je veux montrer 5 liens dans chaque catégorie.

Répondre

0

Je résolu moi-même, en utilisant le code suivant:

foreach ($bookmarks as $b) 
{ 
    $category[$b["category_name"]][] = array(
     "link_id" => $b["link_id"], 
     "link_url" => $b["link_url"], 
     "link_name" => $b["link_name"], 
     "link_target" => $b["link_target"], 
     "link_description" => $b["link_description"], 
     "link_updated" => $b["link_updated"], 
     "taxonomy_id" => $b["taxonomy_id"], 
     "term_id" => $b["term_id"], 
     "category_name" => $b["category_name"] 
    ); 
} 

Cela crée un tableau du nom de la catégorie, et place toutes les sous-matrices dans le tableau parent de droite (basé sur la catégorie). Le tri après la mise à jour du lien est en cours dans la requête SQL.

+1

N'est-ce pas juste: '$ category [$ b [" category_name "]] [] = $ b'? – hakre

0

array_multisort devrait faire l'affaire ici - c'est assez puissant.

+0

Ceci ne prend pas en compte le nom de catégorie et link_updated comme il l'a demandé. – Seb

1

En utilisant usort() vous pouvez trier vos tableaux de quelque façon que vous voulez:

function sort_crazy_way($a, $b){ 
    // do your business. 
} 

usort($array, 'sort_crazy_way'); 

Une fois que vous l'obtenez triée, vous pouvez créer le dernier tableau dans une autre boucle.

Dans le manuel PHP:

La fonction de comparaison doit retourner un moins nombre entier , égal ou supérieur à zéro si le premier argument est considéré comme respectivement inférieur, égal à ou supérieur au second.

Ainsi, votre fonction de comparaison devrait être quelque chose comme:

function sort_crazy_way($a, $b){ 
    $sorted_by_category = strcmp($a['category_name'], $b['category_name']); 
    if($sorted_by_category){ 
    return $sorted_by_category; 
    } 

    // If we're here, category_name is the same. Compare link_updated. 

    $time_diff = strtotime($a['link_updated']) - strtotime($b['link_updated']); 
    return $time_diff; 
} 
+0

Peut-être que je suis trop fatigué (il est 12h30 ici), mais je ne peux toujours pas comprendre comment trier ce correct. J'ai essayé multiple if dans la fonction usort, mais rien ne me donne la méthode de tri correcte. –

+0

Vérifiez ma réponse mise à jour. Cela devrait fonctionner comme prévu. – Seb

+0

Non, cela n'a pas fonctionné. Vous m'avez évidemment mis sur la bonne voie, mais je n'arrive pas à le trier d'abord par last_updated, puis par la catégorie. Mon but ultime est de le faire trier comme suit: 1. Troisième catégorie, 1.1. Nouveau lien ajouté, 1.2. Un lien très ancien, 2. Deuxième catégorie, 2.1. Le plus récent lien dans le deuxième chat., 2.2. Vieux lien etc –

Questions connexes