Comment trier un tableau PHP par un élément imbriqué à l'intérieur?

j'ai un tableau comme ceci:

Array
(
    [0] => Array
        (
            'name' => "Friday"
            'weight' => 6
        )
    [1] => Array
        (
            'name' => "Monday"
            'weight' => 2
        )
)

je voudrais saisir les dernières valeurs dans ce tableau (le 'poids'), et utiliser cela pour trier les éléments du tableau principal. Donc, dans ce tableau, je voudrais le trier de façon à ce que l'élément "lundi" apparaisse avant l'élément "vendredi".

31
demandé sur codaddict 2010-09-13 19:27:17

8 réponses

Vous pouvez utiliser usort comme:

function cmp($a, $b) {
   return $a['weight'] - $b['weight'];
}

usort($arr,"cmp");
37
répondu codaddict 2010-09-13 15:34:31

peut être fait en utilisant un fonction anonyme.

Aussi, si votre 'poids' est un chaîne utilisez l'un des autres retours (voir les lignes commentées):

<?php

$arr = array(
    0 => array (
        'name'   => 'Friday',
        'weight' => 6,
    ),
    1 => array (
        'name'   => 'Monday',
        'weight' => 2,
    ),
);

// sort by 'weight'
usort($arr, function($a, $b) { // anonymous function
    // compare numbers only
    return $a['weight'] - $b['weight'];

    // compare numbers or strings
    //return strcmp($a['weight'], $b['weight']);

    // compare numbers or strings non-case-sensitive
    //return strcmp(strtoupper($a['weight']), strtoupper($b['weight']));
});

var_export($arr);

/*
array (
    0 => array (
        'name'   => 'Monday',
        'weight' => 2,
    ),
    1 => array (
        'name'   => 'Friday',
        'weight' => 6,
    ),
)
*/
6
répondu Geo 2014-04-18 17:49:04
5
répondu PatrickS 2010-09-13 15:30:35

D'accord avec usort, j'utilise aussi parfois array_multisort (http://ca2.php.net/manual/en/function.usort.php) Exemple 3, Tri des résultats de la base de données. Vous pourriez faire quelque chose comme:

<?php
$days = array(
  array('name' => 'Friday', 'weight' => 6),
  array('name' => 'Monday', 'weight' => 2),
);

$weight = array();
foreach($days as $k => $d) {
  $weight[$k] = $d['weight'];
}

print_r($days);

array_multisort($weight, SORT_ASC, $days);

print_r($days);
?>

Sortie:

Array
(
    [0] => Array
        (
            [name] => Friday
            [weight] => 6
        )

    [1] => Array
        (
            [name] => Monday
            [weight] => 2
        )

)
Array
(
    [0] => Array
        (
            [name] => Monday
            [weight] => 2
        )

    [1] => Array
        (
            [name] => Friday
            [weight] => 6
        )

)
3
répondu Konel Sum 2010-09-13 15:46:43

Vous pouvez également utiliser une fonction anonyme.

usort($items, function($a, $b) {
    return $a['name'] > $b['name'];
});
2
répondu Richard Ayotte 2014-11-13 16:13:16

si le fichier que vous triez par est string comme titlename,

array_multisort + Drapeaux pour Tri Naturel et CaseInSensitivity sont la voie à suivre:

$sort_by_title = array();
foreach($items as $item) {
  $sort_by_title [] = $item['title'];
}
array_multisort($sort_by_title , SORT_ASC, SORT_NATURAL | SORT_FLAG_CASE, $items );
1
répondu d.raev 2016-07-26 14:31:06

notez, si l'élément sur lequel vous faites le tri est un flottant comme .0534 et .0353 (comme pour un pourcentage), alors vous devez multiplier les deux PAR 1000. je ne sais pas pourquoi franchement... il semble que usort semble à comparer les valeurs entières.

m'a fallu un certain temps pour comprendre cela...

et les 2 conseils qui peuvent ne pas être immédiatement évident:

  1. si vos tableaux sont des objets, vous pouvez utiliser return $a->poids - $b->poids bien sûr
  2. si vous revenez $b->poids - $a->poids, il va trier desending.
0
répondu Barry 2017-08-17 01:18:42

Voici une fonction de refroidissement qui pourraient vous aider:

function subval_sort($a,$subkey,$sort) {
    foreach($a as $k=>$v) {
        $b[$k] = strtolower($v[$subkey]);
    }
    if($b)
    {
        $sort($b);
        foreach($b as $key=>$val) {
            $c[] = $a[$key];
        }
        return $c;
    }
}

envoyer le tableau comme $a la touche $subkey et' asort 'ou' sort ' pour le $sort variable

-1
répondu d2burke 2010-09-13 15:51:01