PHP bir tablo sıralama

4 Cevap php

Ben biraz zorluk benim dizi sıralama var. Bu şuna benzer:

[0] => Array
        (
            [firstname] => Jnic
            [lastname] => Fortin
            [points] => Array
                (
                    [id] => 20453
                    [f] => 31
                    [r] => 7                 
                    [total] => 82
                )

        )

    [1] => Array
        (
            [firstname] => Kris
            [lastname] => Anders
            [points] => Array
                (
                    [id] => 20309                    
                    [f] => 0
                    [r] => 1
                    [total] => 56
                )

        )
[2] => Array
            (
                [firstname] => Em
                [lastname] => Zajo
                [points] => Array
                    (
                        [id] => 20339                    
                        [f] => 8
                        [r] => 3
                        [total] => 254
                    )

            )

Ben "total" DESC göre sıralamak istiyorum. Ben bunu nasıl yapabildin? Her çeşit ok dizisi düzen olurdu [2] [0] [1] (254,82,56)

Teşekkürler

4 Cevap

Muhtemelen bunun için usort işlevini kullanabilirsiniz: bu dizinin elemanlarını karşılaştırmak için bir geri arama işlevini kullanarak, bir dizi sıralar:

bool usort  ( array &$array  , callback $cmp_function  )

This function will sort an array by its values using a user-supplied comparison function. If the array you wish to sort needs to be sorted by some non-trivial criteria, you should use this function

Işlev $element['points']['total'] başına karşılaştırmak için tanımlanmış ise, bu hile yapmak gerekir.


Edit : And here is the example, using
uasort, which is the same as usort, but will keep the array keys, like pointed out by ryanday :

İlk olarak, diziyi bildirmek edelim:

$a = array(
    array(
        'firstname' => 'Jnic',
        'lastname' => 'Fortin',
        'points' => array(
            'id' => 20453,
            'f' => 31,
            'r' => 7,
            'total' => 82,
        ),
    ),
    array(
        'firstname' => 'Kris',
        'lastname' => 'Anders',
        'points' => array(
            'id' => 20309,
            'f' => 0,
            'r' => 1,
            'total' => 56,
        ),
    ),
    array(
        'firstname' => 'Em',
        'lastname' => 'Zajo',
        'points' => array(
            'id' => 20339,
            'f' => 8,
            'r' => 3,
            'total' => 254,
        ),
    ),
);

Ve sonra, karşılaştırma fonksiyonu:

function my_compare($a, $b) {
    if ($a['points']['total'] > $b['points']['total']) {
        return -1;
    } else if ($a['points']['total'] < $b['points']['total']) {
        return 1;
    }
    return 0;
}

Ve nihayet, bunu kullanın:

uasort($a, 'my_compare');
var_dump($a);

Ve total açıklamaya göre sınıflandırılmaktadır dizi olsun

array
  2 => 
    array
      'firstname' => string 'Em' (length=2)
      'lastname' => string 'Zajo' (length=4)
      'points' => 
        array
          'id' => int 20339
          'f' => int 8
          'r' => int 3
          'total' => int 254
  0 => 
    array
      'firstname' => string 'Jnic' (length=4)
      'lastname' => string 'Fortin' (length=6)
      'points' => 
        array
          'id' => int 20453
          'f' => int 31
          'r' => int 7
          'total' => int 82
  1 => 
    array
      'firstname' => string 'Kris' (length=4)
      'lastname' => string 'Anders' (length=6)
      'points' => 
        array
          'id' => int 20309
          'f' => int 0
          'r' => int 1
          'total' => int 56


ryanday > Thanks for your answer !

Ben size uygun bir dizi sipariş gerektiğini söyledi fark [2] [0] [1], sen uasort() fonksiyonu ile Pascal'ın tavsiye takip etmek bu indeks dernek önemli ise.

usort karmaşık durumlar için çok esnek olabilir sağlam bir çözümdür. Veri seti nispeten basit olduğundan ben şu öneririm:

// assuming your array has been defined in $a
$sort = array();
foreach ($a as $key => $suba)
{
    // this collects the values you want to sort by and associates them with the correct index
    $sort[$key] = $suba['points']['total'];
}
// this sorts the collected values
sort($sort);

// this re-sorts $a according to the sorted $sort array
array_multisort($a, $sort);

performansı hakkında emin ama bu olmasa daha iyi usort olarak en azından iyi değil