I need to sort an array. Both values and keys are the same and are strings. Basically, array looks similar to this:
$test = array(
'1' => '1',
'2' => '2',
'1.5' => '1.5',
'3' => '3',
'4' => '4',
'3.5' => '3.5',
'2XS' => '2XS',
'2XL' => '2XL',
'XXL' => 'XXL',
);
Expected Output:
Array
(
[0] => 1
[1] => 1.5
[2] => 2
[5] => 3
[6] => 3.5
[7] => 4
[3] => 2XL
[4] => 2XS
[8] => XXL
)
Any ideas?
<?php
$test = array(
'1' => '1',
'2' => '2',
'1.5' => '1.5',
'3' => '3',
'4' => '4',
'3.5' => '3.5',
'2XS' => '2XS',
'2XL' => '2XL',
'XXL' => 'XXL',
);
$numericArray=array();
$stringsArray=array();
array_map(function($value) use (&$numericArray,&$stringsArray) {
if(is_numeric($value))
{
$numericArray[]=$value;//Here we are putting numeric values
}
else
{
$stringsArray[]=$value;//Here we are putting string values
}
}, $test);
sort($numericArray,SORT_NUMERIC);//sorting on numeric basis
sort($stringsArray,SORT_REGULAR);//sorting on string basis
$result=array_merge($numericArray,$stringsArray);//merging both of them
print_r($result);
Output:
Array
(
[0] => 1
[1] => 1.5
[2] => 2
[3] => 3
[4] => 3.5
[5] => 4
[6] => 2XL
[7] => 2XS
[8] => XXL
)
<?php
$test = array(
'1' => '1',
'2' => '2',
'1.5' => '1.5',
'3' => '3',
'4' => '4',
'3.5' => '3.5',
'2XS' => '2XS',
'2XL' => '2XL',
'XXL' => 'XXL',
);
function sortNandS($array){
$nums = [];
$strings = [];
foreach($array as $elm) {
is_numeric($elm) ? $nums[]= $elm : $strings[]=$elm;
}
sort($nums,SORT_NUMERIC);
sort($strings,SORT_REGULAR);
$result=array_merge($nums,$strings);
return $result;
}
print_r(sortNandS($test));
The solution using usort
, is_numeric
and strcmp
functions:
usort($test, function ($a, $b) {
if (is_numeric($a) && is_numeric($b)) {
return $a - $b;
} else if (is_numeric($a) && !is_numeric($b)) {
return -1;
} else if (!is_numeric($a) && is_numeric($b)) {
return 1;
} else {
return strcmp($a, $b);
}
});
print_r($test);
The output:
Array
(
[0] => 1
[1] => 1.5
[2] => 2
[3] => 3
[4] => 3.5
[5] => 4
[6] => 2XL
[7] => 2XS
[8] => XXL
)