Jared Eitnier
Jared Eitnier

Reputation: 7152

PHP array sort by 2nd key

I have an array that needs sorted by 'yes' and 'no' keys - how might this be done in PHP? Specifically I would like all yes's to be first index (there will only ever be 1 yes and many no's)

Array (
[0] => Array
    (
        [no] => Array
            (
                [0] => 379
            )

        [yes] => Array
            (
                [1] => 370
            )

    )

[1] => Array
    (
        [yes] => Array
            (
                [0] => 372
            )

    )

[2] => Array
    (
        [no] => Array
            (
                [0] => 377
            )

        [yes] => Array
            (
                [1] => 374
            )

    )

)

Upvotes: 0

Views: 168

Answers (3)

YMMD
YMMD

Reputation: 3780

$ar = array(
    array(
        'no'  => array(0 => 379),
        'yes' => array(1 => 370)
    ),
    array(
        'yes' => array(0 => 372)
    ),
    array(
        'no'  => array(0 => 377),
        'yes' => array(1 => 374)
    )
);

usort($ar, function($a, $b){
    $v_a = array_values($a['yes']);
    $v_b = array_values($b['yes']);
    if($v_a[0] == $v_b[0]){
        return 0;
    }
    return $v_a[0] < $v_b[0] ? -1 : 1;
});

print_r($ar);

Result:

Array
(
    [0] => Array
        (
            [no] => Array
                (
                    [0] => 379
                )

            [yes] => Array
                (
                    [1] => 370
                )

        )

    [1] => Array
        (
            [yes] => Array
                (
                    [0] => 372
                )

        )

    [2] => Array
        (
            [no] => Array
                (
                    [0] => 377
                )

            [yes] => Array
                (
                    [1] => 374
                )

        )

)

Upvotes: 0

Rajan Rawal
Rajan Rawal

Reputation: 6317

if your propose is just to show 'yes' key first and 'no' keys later then try this

function deep_krsort(&$arr) { 
    krsort($arr); 
    foreach ($arr as &$a) { 
        if (is_array($a) && !empty($a)) { 
            deep_krsort($a); 
        } 
    } 
} 

How ever this will change your inner depth element in reverse order

Upvotes: 0

Mark Reed
Mark Reed

Reputation: 95252

You can use uksort to sort an array according to its keys using a custom comparison function:

<?php
 function yesfirst($a, $b) {
  if ($a === 'yes') {
    return -1;
  } elseif ($b === 'yes') {
    return 1;
  } else {
    return 0;
  }
}

function uksort_yesfirst($ary) {
    uksort($ary, 'yesfirst');
    return $ary;
}

$array = array(
  0 => array( no => array(0 => 379), yes => array(1 => 370)),

  1 => array( yes => array( 0 => 372) ),

  2 => array( no => array( 0 => 377), yes => array( 1 => 374))
);

$array = array_map('uksort_yesfirst', $array);
print_r($array);
?>

Upvotes: 1

Related Questions