How to sort an array of associative arrays by value of a given key in PHP?

前端 未结 19 1807
清酒与你
清酒与你 2020-11-21 23:34

Given this array:

$inventory = array(

   array(\"type\"=>\"fruit\", \"price\"=>3.50),
   array(\"type\"=>\"milk\", \"price\"=>2.90),
   array(\"         


        
相关标签:
19条回答
  • 2020-11-22 00:31

    Since your array elements are arrays themselves with string keys, your best bet is to define a custom comparison function. It's pretty quick and easy to do. Try this:

    function invenDescSort($item1,$item2)
    {
        if ($item1['price'] == $item2['price']) return 0;
        return ($item1['price'] < $item2['price']) ? 1 : -1;
    }
    usort($inventory,'invenDescSort');
    print_r($inventory);
    

    Produces the following:

    Array
    (
        [0] => Array
            (
                [type] => pork
                [price] => 5.43
            )
    
        [1] => Array
            (
                [type] => fruit
                [price] => 3.5
            )
    
        [2] => Array
            (
                [type] => milk
                [price] => 2.9
            )
    
    )
    
    0 讨论(0)
  • 2020-11-22 00:31
    $arr1 = array(
    
        array('id'=>1,'name'=>'aA','cat'=>'cc'),
        array('id'=>2,'name'=>'aa','cat'=>'dd'),
        array('id'=>3,'name'=>'bb','cat'=>'cc'),
        array('id'=>4,'name'=>'bb','cat'=>'dd')
    );
    
    $result1 = array_msort($arr1, array('name'=>SORT_DESC);
    
    $result2 = array_msort($arr1, array('cat'=>SORT_ASC);
    
    $result3 = array_msort($arr1, array('name'=>SORT_DESC, 'cat'=>SORT_ASC));
    
    
    function array_msort($array, $cols)
    {
        $colarr = array();
        foreach ($cols as $col => $order) {
        $colarr[$col] = array();
        foreach ($array as $k => $row) { $colarr[$col]['_'.$k] = strtolower($row[$col]); }
    }
    
    $eval = 'array_multisort(';
    
    foreach ($cols as $col => $order) {
        $eval .= '$colarr[\''.$col.'\'],'.$order.',';
    }
    
    $eval = substr($eval,0,-1).');';
    eval($eval);
    $ret = array();
    foreach ($colarr as $col => $arr) {
        foreach ($arr as $k => $v) {
            $k = substr($k,1);
            if (!isset($ret[$k])) $ret[$k] = $array[$k];
            $ret[$k][$col] = $array[$k][$col];
        }
    }
    return $ret;
    
    
    } 
    
    0 讨论(0)
  • 2020-11-22 00:32

    Complete Dynamic Function I jumped here for associative array sorting and found this amazing function on http://php.net/manual/en/function.sort.php. This function is very dynamic that sort in ascending and descending order with specified key.

    Simple function to sort an array by a specific key. Maintains index association

    <?php
    
    function array_sort($array, $on, $order=SORT_ASC)
    {
        $new_array = array();
        $sortable_array = array();
    
        if (count($array) > 0) {
            foreach ($array as $k => $v) {
                if (is_array($v)) {
                    foreach ($v as $k2 => $v2) {
                        if ($k2 == $on) {
                            $sortable_array[$k] = $v2;
                        }
                    }
                } else {
                    $sortable_array[$k] = $v;
                }
            }
    
            switch ($order) {
                case SORT_ASC:
                    asort($sortable_array);
                break;
                case SORT_DESC:
                    arsort($sortable_array);
                break;
            }
    
            foreach ($sortable_array as $k => $v) {
                $new_array[$k] = $array[$k];
            }
        }
    
        return $new_array;
    }
    
    $people = array(
        12345 => array(
            'id' => 12345,
            'first_name' => 'Joe',
            'surname' => 'Bloggs',
            'age' => 23,
            'sex' => 'm'
        ),
        12346 => array(
            'id' => 12346,
            'first_name' => 'Adam',
            'surname' => 'Smith',
            'age' => 18,
            'sex' => 'm'
        ),
        12347 => array(
            'id' => 12347,
            'first_name' => 'Amy',
            'surname' => 'Jones',
            'age' => 21,
            'sex' => 'f'
        )
    );
    
    print_r(array_sort($people, 'age', SORT_DESC)); // Sort by oldest first
    print_r(array_sort($people, 'surname', SORT_ASC)); // Sort by surname
    
    0 讨论(0)
  • 2020-11-22 00:35

    You can use usort with anonymous function, e.g.

    usort($inventory, function ($a, $b) { return strnatcmp($a['price'], $b['price']); });
    
    0 讨论(0)
  • 2020-11-22 00:35

    For PHP 7 and later versions.

    /**
     * A method for sorting associative arrays by a key and a direction.
     * Direction can be ASC or DESC.
     *
     * @param $array
     * @param $key
     * @param $direction
     * @return mixed $array
     */
    function sortAssociativeArrayByKey($array, $key, $direction){
    
        switch ($direction){
            case "ASC":
                usort($array, function ($first, $second) use ($key) {
                    return $first[$key] <=> $second[$key];
                });
                break;
            case "DESC":
                usort($array, function ($first, $second) use ($key) {
                    return $second[$key] <=> $first[$key];
                });
                break;
            default:
                break;
        }
    
        return $array;
    }
    

    Usage:

    $inventory = sortAssociativeArrayByKey($inventory, "price", "ASC");
    
    0 讨论(0)
  • 2020-11-22 00:37

    This function is re-usable:

    function usortarr(&$array, $key, $callback = 'strnatcasecmp') {
        uasort($array, function($a, $b) use($key, $callback) {
            return call_user_func($callback, $a[$key], $b[$key]);
        });
    }
    

    It works well on string values by default, but you'll have to sub the callback for a number comparison function if all your values are numbers.

    0 讨论(0)
提交回复
热议问题