array_multisort pour les ArrayObject

Rechercher

array_multisort pour les ArrayObject

Par Kao92  -  2 reponses  -  Le 15/09/2011 15:06  -  Editer  - 

Bonjour à tous,

Je souhaiterais savoir si il existe un equivalent de array_multisort mais qui puisse etre utiliser avec un ArrayObject.

 

J'ai essaye avec ma table principale en array et ca marche avec la méthode suivante. (Je trie sur ma colonne 1 puis ma colonne 2)

foreach ($table_generale as $key => $row) {

$col1[$key] = $row['col1'];

$col2[$key] = $row['col2'];

}

array_multisort($col1, SORT_ASC, $col2, SORT_ASC, $table_general);

Mais si je declare ma table generale en ArrayObject (je fais une classe spécifique donc je suis obligé de le declarer comme cela), mon code ne marche pu car le dernier argument doit etre un array.

J'ai bien essayer de le caster (cela ne bug pu) mais il n'y a aucun resultat

array_multisort($col1, SORT_ASC, $col2, SORT_ASC, (array)$table_general);

 

Alors si vous connaissez l'équivalent cela me serait utilie, ou si il y a moyen de faire des classes extend de array

 

Merci

 

Réponses apportées à cette discussion

Par Cyrano  -  Le 15/09/2011 17:48  -  Haut de page  - 

Une petite recherche sur INternet et on trouve des choses... ceci par exemple :

Et du coup j'ai fait un petit test en me basant dessus, ça semble fonctionner assez bien, ça ressemble à ceci :

<?php
/**
 * Création d'un tableau à deux dimensions
 */
$array_to_be_sorted = array();
$array_to_be_sorted[] = array('lastname' => 'Jones', 'firstname' => 'Michael');
$array_to_be_sorted[] = array('lastname' => 'Adams', 'firstname' => 'Zach');
$array_to_be_sorted[] = array('lastname' => 'Smith', 'firstname' => 'Jim');
$array_to_be_sorted[] = array('lastname' => 'Adams', 'firstname' => 'Tom');
/**
 * Conversion en ArrayObject
 */
$arrayObject = new ArrayObject($array_to_be_sorted);
/**
 * Affichage avant le tri
 */
echo("<pre>Avant :\n");
var_dump($arrayObject);
echo("</pre>\n");
// Résultat de l'affichage :
// Avant :
// object(ArrayObject)#1 (1) {
//   ["storage":"ArrayObject":private] =>  array(4) {
//     [0] =>    array(2) {
//       ["lastname"] =>  string(5) "Jones"
//       ["firstname"] => string(7) "Michael"
//     }
//     [1] =>    array(2) {
//       ["lastname"] =>  string(5) "Adams"
//       ["firstname"] => string(4) "Zach"
//     }
//     [2] =>    array(2) {
//       ["lastname"] =>  string(5) "Smith"
//       ["firstname"] => string(3) "Jim"
//     }
//     [3] =>    array(2) {
//       ["lastname"] =>  string(5) "Adams"
//       ["firstname"] => string(3) "Tom"
//     }
//   }
// }
/**
 * Fonction de tri personnalisée
 *
 * @param   String $a
 * @param   String $b
 * @return  Int
 */
function alpha_ObjectSort($a, $b)
{
    if ($a['lastname'] == $b['lastname'])
    {
        return strnatcmp($a['firstname'], $b['firstname']);
    }
    return strnatcmp($a['lastname'], $b['lastname']);
}
/**
 * Lancement du tri
 */
$arrayObject->uasort("alpha_ObjectSort");
/**
 * Affichage après le tri :
 */
echo("<pre>Après :\n");
var_dump($arrayObject);
echo("</pre>\n");
// Résultat de l'affichage :
// Après :
// object(ArrayObject)#1 (1) {
//   ["storage":"ArrayObject":private] =>  array(4) {
//     [3] =>    array(2) {
//       ["lastname"] =>  string(5) "Adams"
//       ["firstname"] => string(3) "Tom"
//     }
//     [1] =>    array(2) {
//       ["lastname"] =>  string(5) "Adams"
//       ["firstname"] => string(4) "Zach"
//     }
//     [0] =>    array(2) {
//       ["lastname"] =>  string(5) "Jones"
//       ["firstname"] => string(7) "Michael"
//     }
//     [2] =>    array(2) {
//       ["lastname"] =>  string(5) "Smith"
//       ["firstname"] => string(3) "Jim"
//     }
//   }
// }
?>

À toi d'adapter la fonction de tri personnalisée selon ts propres besoins, l'important, c'est l'utilisation de la méthode uasort() de l'objet ArrayObject (ligne 64)

 
Par Kao92  -  Le 15/09/2011 22:12  -  Haut de page  - 

Merci pour ta réponse mais je compte l'utiliser dans une classe générique donc je ne pouvais pas vraiment definir mes propres functions de tri.

Au final j'ai fait une sale bidouille, ou je passe mon ArrayObject dans un array pour le trier et le renvoyer dans le ArrayObject. Enfin ce ArrayObject est ma classe donc j'ai fait ma méthode sort avec mes arguments personalisables sur le modèle du multisort

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |