How do I sort a PHP array by an element nested inside?

前端 未结 8 2170
长情又很酷
长情又很酷 2020-12-05 23:00

I have an array like the following:

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


        
相关标签:
8条回答
  • 2020-12-05 23:04

    Here's a cool function that might help:

    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;
        }
    }
    

    Send in the array as $a the key as $subkey and 'asort' or 'sort' for the $sort variable

    0 讨论(0)
  • 2020-12-05 23:05

    try this: http://php.net/manual/en/function.usort.php

    0 讨论(0)
  • 2020-12-05 23:09

    Can be done using an anonymous function.

    Also if your 'weight' is a string use one of the other returns (see the commented out lines):

    <?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,
        ),
    )
    */
    
    0 讨论(0)
  • 2020-12-05 23:11

    If the filed you sort by is string like title name,
    array_multisort + Flags for Natural Sorting and CaseInSensitivity are the way to go:

    $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 );
    
    0 讨论(0)
  • 2020-12-05 23:19

    You can also use an anonymous function.

    usort($items, function($a, $b) {
        return $a['name'] > $b['name'];
    });
    
    0 讨论(0)
  • 2020-12-05 23:21

    Agree with usort, I also sometimes use array_multisort (http://ca2.php.net/manual/en/function.usort.php) example 3, sorting database results. You could do something like:

    <?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);
    ?>
    

    Output:

    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
            )
    
    )
    
    0 讨论(0)
提交回复
热议问题