Je trier actuellement un tableau d'objets en fonction d'un ensemble de critères personnalisé. Les données ressemble à:Tri temporaire d'un tableau d'objets
// Array to Sort
Object
$key = value1
Object
$key = value2
Object
$key = value3
Object
$key = value4
// Comparison Object
Sorter
$data = array('value1', 'value2', 'value4', 'value3');
Je suis en train de réduire le nombre de boucles, et compris qu'il devrait y avoir un moyen plus facile/plus rapide de le faire. Je ne veux pas ajouter des valeurs personnalisées aux objets eux-mêmes à trier. L'idée de base est de pouvoir extraire un tri personnalisé d'un jeu de données précédent, sans rien faire pour les objets eux-mêmes.
J'ai essayé de regarder dans la documentation de array_intersects, etc, mais je ne pouvais pas trouver une bonne méthode pour gérer cela ....
Voici le code que j'ai actuellement:
$children = array(
array('key' => 'value1'),
array('key' => 'value2'),
array('key' => 'value3'),
array('key' => 'value4')
);
$comparison = array('value1', 'value2', 'value4', 'value3');
$sorter = array();
// loop 1 -- create a map
foreach ($children as &$child) {
$sorter[] = array(
'sort' => array_search($child['key'], $comparison, true),
'child' => &$child
);
}
// loop 2 -- sort based upon the sort key
usort($sorter, array($this, 'compare'));
// loop 3 (ugh -- I think this can be done in 2 loops)
$output = array();
foreach ($sorter as &$item) {
$output[] = $item['child'];
}
// return
return $output;
// sort function
private function compare(Array $a, Array $b) {
if( $a['sort'] == $b['sort']) { return 0 ; }
return ($a['sort'] < $b['sort']) ? -1 : 1;
}
Cela fonctionnerait si l'objet de comparaison avait toujours les valeurs du tableau d'original. Ce n'est pas garanti que le mien le fera - je préférerais une solution où les valeurs omises sont toujours incluses. – ansiart
Ok, mais votre solution n'en tient pas compte non plus. Que voulez-vous faire si la valeur n'est pas dans $ comparaison? Poussez-le à la fin? Enlevez-le? PS .: en PHP, un tableau n'est pas un objet. – netcoder
Quoi qu'il en soit, j'ai mis à jour ma réponse afin que les valeurs qui ne sont pas en comparaison soient poussées à la fin. – netcoder