php中的多维数组排序


Multidimensional array sorting in php

我的一个函数返回这个数组。。。是的,我在SO上看到了其他例子,但不能解决我的问题。

array (size=4)
  0 => 
    array (size=2)
      'refferrer' => string 'http://google.com/' (length=18)
      'number_of_reffers' => string '15' (length=2)
  1 => 
    array (size=2)
      'refferrer' => string 'https://facebook.com/' (length=21)
      'number_of_reffers' => string '22' (length=2)
  2 => 
    array (size=2)
      'refferrer' => string 'none' (length=4)
      'number_of_reffers' => string '74' (length=2)
  3 => 
    array (size=2)
      'refferrer' => string 'http://findy.com/' (length=17)
      'number_of_reffers' => string '6' (length=1)

我想知道如何使用按降序和密码顺序对这个数组进行排序

'number_of_refers'。。。

我想说的是,我希望拥有最多reffers的那个先来,然后是下一个,以此类推

这可能吗?我如何在php中做到这一点。

谢谢你的帮助。

您需要启动

给定你的数组,你会这样做:

usort( $array, 'sort_by_referrer_count' );
var_dump($array);
// This will sort ascending
function sort_by_referrer_count( $a, $b ) {
    // Some defensive coding to ensure keys exist
    $a = ( isset( $a['number_of_referrers'] ) ) ? $a['number_of_referrers'] : 0;
    $b = ( isset( $b['number_of_referrers'] ) ) ? $b['number_of_referrers'] : 0;
    if ($a == $b) {
        return 0;
    }
    return ( $a < $b ) ? -1 : 1;
}

如果你想下降,那么你可以这样做(使用上面相同的功能):

usort( $array, 'sort_by_referrer_count' );
$array = array_reverse( $array );

在最简单的意义上;你可能只想试试这个:

    <?php
        // SORTING ALGORITHM:
        // TO SORT IN THE OPPOSITE SENSE... 
        // (IE. ASCENDING [AS OPPOSED TO THE DEFAULT: DESCENDING]
        // CHANGE THE LESS THAN (<) BELOW TO GREATER THAN (>) 
        function orderByNumRef($arrPrev, $arrNext) {
            if ($arrPrev['number_of_reffers'] == $arrNext['number_of_reffers']) {
                return 0;
            }
            return ($arrPrev['number_of_reffers'] < $arrNext['number_of_reffers']) ? -1 : 1;
        }
        //GIVEN ARRAY - DYNAMIC OR HARD-CODED
        $arr = array(
            array(
                'refferrer'         => 'http://google.com/',
                'number_of_reffers' =>'15',
            ),
            array(
                'refferrer'         => 'https://facebook.com/',
                'number_of_reffers' =>'74',
            ),
            array(
                'refferrer'         => 'http://findy.com/',
                'number_of_reffers' =>'6',
            ),
        );

        //BEFORE SORTING:
        var_dump($arr);

        uasort($arr, 'orderByNumRef');
        //AFTER SORTING:
        var_dump($arr);

希望它能帮助。。。

试试这个:

<?php
$my_array;
//Sort Acceding 
usort($my_array, create_function('$a,$b', 'return (Int)$a["number_of_reffers"]-(Int)$b["number_of_reffers"];'));
//Or sort Descending
usort($my_array, create_function('$a,$b', 'return (Int)$b["number_of_reffers"]-(Int)$a["number_of_reffers"];'));

我发现最简单的方法是创建一个以number_of_reffers为键的新数组。然后使用ksort()krsort()对新数组进行排序。这最终使原始数组保持不变。否则,以预期格式创建原始数组会更好。

<?php
// original array
$array = array(
    array('refferrer' => 'http://google.com/', 'number_of_reffers' => '15'),
    array('refferrer' => 'https://facebook.com/', 'number_of_reffers' => '22'),
    array('refferrer' => 'none', 'number_of_reffers' => '74'),
    array('refferrer' => 'http://findy.com/', 'number_of_reffers' => '6')
);
$foo = array(); // new empty array
// loop through $array, assign the number_of_reffers as the key for the refferrer
foreach ($array as $key => $bar) {
    $foo[$bar['number_of_reffers']] = $bar['refferrer'];
}
/* 
    new array will be:
    array(
        '15' => 'http://google.com/',
        '22' => 'https://facebook.com/'
        etc .....
    )
*/

// use Ksort / Krsort to sort the key asc or desc
ksort($foo); // ascending order
#krsort($foo); // descending order
die('<pre>'.print_r($foo, true).'</pre>'); // pretty printing of sorted array
?>

作为一个函数

<?php
Function Referrer_sort($array, $asc = true) {
    IF (!is_array($array)) { return 'not an array'; }
    $result = array();
    foreach ($array as $key => $value) {
        $result[$value['number_of_reffers']] = $value['refferrer'];
    }
    switch ($asc) {
        case false: krsort($result); return $result;
        default: ksort($result); return $result;
    }
}
$foo_asc = Referrer_sort($array);
$foo_desc = Referrer_sort($array, false);
die('<pre>Ascending:<br>'.print_r($foo_asc, true).'<br>Descending:<br>'.print_r($foo_desc, true).'</pre>');
?>

更改原始阵列

通过更改值为number_of_reffers的索引键来修改原始数组。

<?php
Function Rebuild_Referrer_sort($array, $asc = true) {
    IF (!is_array($array)) { return 'not an array'; }
    $result = array();
    foreach ($array as $key => $value) {
        $result[$value['number_of_reffers']] = array('refferrer' => $value['refferrer'], 'number_of_reffers' => $value['number_of_reffers']);
    }
    switch ($asc) {
        case false: krsort($result); return $result;
        default: ksort($result); return $result;
    }
}

$foo_asc = Rebuild_Referrer_sort($array);
$foo_desc = Rebuild_Referrer_sort($array, false);
die('<pre>Ascending:<br>'.print_r($foo_asc, true).'<br>Descending:<br>'.print_r($foo_desc, true).'</pre>');
/**
  Returns:
Ascending:
Array
(
    [6] => Array
        (
            [refferrer] => http://findy.com/
            [number_of_reffers] => 6
        )
    [15] => Array
        (
            [refferrer] => http://google.com/
            [number_of_reffers] => 15
        )
    [22] => Array
        (
            [refferrer] => https://facebook.com/
            [number_of_reffers] => 22
        )
    [74] => Array
        (
            [refferrer] => none
            [number_of_reffers] => 74
        )
)
Descending:
Array
(
    [74] => Array
        (
            [refferrer] => none
            [number_of_reffers] => 74
        )
    [22] => Array
        (
            [refferrer] => https://facebook.com/
            [number_of_reffers] => 22
        )
    [15] => Array
        (
            [refferrer] => http://google.com/
            [number_of_reffers] => 15
        )
    [6] => Array
        (
            [refferrer] => http://findy.com/
            [number_of_reffers] => 6
        )
)
*/
?>