Maison > développement back-end > tutoriel php > Comment trier efficacement un tableau PHP multidimensionnel par colonne, y compris les dates et les critères personnalisés ?

Comment trier efficacement un tableau PHP multidimensionnel par colonne, y compris les dates et les critères personnalisés ?

Susan Sarandon
Libérer: 2024-12-20 16:34:09
original
888 Les gens l'ont consulté

How to Efficiently Sort a Multidimensional PHP Array by Column, Including Dates and Custom Criteria?

Tri d'un tableau multidimensionnel en PHP : une approche flexible

La requête

Comment organiser efficacement un tableau multidimensionnel basé sur une colonne spécifiée, notamment lorsque les données comportent des dates et que vous désirez des critères de tri personnalisés ?

Le Réponse

Présentation d'une solution améliorée pour PHP 5.3

Cette solution offre plusieurs avantages :

  • Réutilisable : Définir la colonne de tri en tant que variable.
  • Flexible : Gérez plusieurs colonnes de tri et des critères de départage secondaires.
  • Réversible : Triez par ordre croissant ou décroissant pour chaque colonne.
  • Extensible : utilisez des projections personnalisées pour des projets complexes ou non comparables data.
  • Associatif : utilisez usort ou uasort pour la compatibilité avec les tableaux associatifs.

Le code

function make_comparer() {
    // Normalize criteria
    $criteria = func_get_args();
    foreach ($criteria as $index => $criterion) {
        $criteria[$index] = is_array($criterion) ? array_pad($criterion, 3, null) : array($criterion, SORT_ASC, null);
    }

    return function ($first, $second) use (&$criteria) {
        foreach ($criteria as $criterion) {
            // Comparison details
            list($column, $sortOrder, $projection) = $criterion;
            $sortOrder = $sortOrder === SORT_DESC ? -1 : 1;

            // Project and compare values
            $lhs = $projection ? call_user_func($projection, $first[$column]) : $first[$column];
            $rhs = $projection ? call_user_func($projection, $second[$column]) : $second[$column];

            // Determine the comparison result
            if ($lhs < $rhs) {
                return -1 * $sortOrder;
            } elseif ($lhs > $rhs) {
                return 1 * $sortOrder;
            }
        }

        // Tiebreakers exhausted
        return 0;
    };
}
Copier après la connexion

Utilisation

Considérez l'échantillon data :

$data = array(
    array('zz', 'name' => 'Jack', 'number' => 22, 'birthday' => '12/03/1980'),
    array('xx', 'name' => 'Adam', 'number' => 16, 'birthday' => '01/12/1979'),
    array('aa', 'name' => 'Paul', 'number' => 16, 'birthday' => '03/11/1987'),
    array('cc', 'name' => 'Helen', 'number' => 44, 'birthday' => '24/06/1967'),
);
Copier après la connexion

Tri de base :

  • Trier par la colonne "nom" : usort($data, make_comparer('name'));

Tri avec plusieurs Colonnes :

  • Trier par la colonne "numéro" puis par la colonne à index zéro : usort($data, make_comparer('number', 0));

Fonctionnalités avancées :

  • Inverser Tri : Trier par la colonne "nom" décroissante : usort($data, make_comparer(['name', SORT_DESC]));
  • Projections personnalisées : Dates d'anniversaire du projet à horodatages pour le tri : usort($data, make_comparer(['birthday', SORT_ASC, 'date_create']));

Cas d'utilisation complexe :

  • Trier par la colonne "numéro" décroissant, suivi du colonne "anniversaire" projetée par ordre croissant :

    usort($data, make_comparer(
      ['number', SORT_DESC],
      ['birthday', SORT_ASC, 'date_create']
    ));
    Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal