array_multisort pour les ArrayObject
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
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)
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