Reputation: 7152
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
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
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
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