web-dev-qa-db-fra.com

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

J'ai un tableau comme celui-ci:

 Tableau 
 (
 [0] => Tableau 
 (
 'Name' => "Friday" 
 "Poids" => 6 
) 
 [1] => Tableau 
 (
 'Name' => "Monday" 
 'Weight' => 2 
) 
) 

J'aimerais saisir les dernières valeurs de ce tableau (le "poids") et les utiliser pour trier les principaux éléments du tableau. Donc, dans ce tableau, je souhaiterais le trier de sorte que l'élément 'Monday' apparaisse avant l'élément 'Friday'.

34
geerlingguy

Vous pouvez utiliser usort as:

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

usort($arr,"cmp");
38
codaddict

Peut être fait en utilisant une fonction anonyme .

De plus, si votre "poids" est un string , 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
Geo
5
PatrickS

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 pouvez 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
Konel Sum

Vous pouvez également utiliser une fonction anonyme.

usort($items, function($a, $b) {
    return $a['name'] > $b['name'];
});
3
Richard Ayotte

Si le fichier que vous triez est une chaîne comme titlename,
array_multisort + Les drapeaux pour le tri naturel et CaseInSensitivity sont le chemin à parcourir:

$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
d.raev

NOTE: si l'élément sur lequel vous triez est un float comme .0534 et .0353 (comme pour un pourcentage), vous devez alors multiplier les deux par 1000. Vous ne savez pas pourquoi, franchement ... il semble que l'usort semble comparer le nombre entier valeurs.

m'a pris un peu de temps pour comprendre celui-là ...

et 2 astuces qui peuvent ne pas être immédiatement évidentes:

  1. si vos tableaux sont des objets, vous pouvez utiliser return $ a-> weight - $ b-> weight of course
  2. si vous retournez $ b-> poids - $ a-> poids, le résultat sera trié.
0
Barry