2017-04-12 50 views
1

我需要对数组进行排序。值和键都是相同的,都是字符串。基本上,阵列类似于此:按值/键排序数组 - 字符串和数值的混合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', 
    ); 

预期输出:

Array 
(
    [0] => 1 
    [1] => 1.5 
    [2] => 2 
    [5] => 3 
    [6] => 3.5 
    [7] => 4 
    [3] => 2XL 
    [4] => 2XS 
    [8] => XXL 
) 

任何想法?

+1

任何尝试??我们不需要重新发明轮子 – hassan

+0

我尝试使用sort()进行自然排序,以至于不会有太大的帮助。我是一个完整的小白。 – dodo254

回答

4

PHP code demo

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

输出:

Array 
(
    [0] => 1 
    [1] => 1.5 
    [2] => 2 
    [3] => 3 
    [4] => 3.5 
    [5] => 4 
    [6] => 2XL 
    [7] => 2XS 
    [8] => XXL 
) 
+0

为什么不只是'foreach'? 'array_map'使这种方式更复杂,然后它需要。 – nerdlyist

+0

@nerdlyist是的,我可以使用'foreach'是正确的,但通常我使用'array_map'。以上结果可以通过不同的方法来实现。但我遵循这一点,这不是一个问题。 –

+0

@nerdlyist这可能是一个案例,如果任何人不是'array_map'的家庭比看到这个人会学习一个新的功能:) –

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

@SahilGulati解决方案绝对没有错,这与'function'和'foreach'非常相似。 – nerdlyist

1

使用该溶液usortis_numericstrcmp功能:

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

输出:

Array 
(
    [0] => 1 
    [1] => 1.5 
    [2] => 2 
    [3] => 3 
    [4] => 3.5 
    [5] => 4 
    [6] => 2XL 
    [7] => 2XS 
    [8] => XXL 
)