在保留索引的同时对数组进行排序


sort array while preserving indexes

我需要转换

array(  
    '0' => 'z1',    
    '1' => 'Z10', 
    '2' => 'z12', 
    '3' => 'Z2', 
    '4' => 'z3', )

进入

array(
    '0' => 'z1',
    '3' => 'Z2',
    '4' => 'z3',
    '1' => 'Z10',
    '2' => 'z12',
)

不使用asort。我的插入方法没有在数组中插入任何内容,我做错了什么?P.S有比做两个循环更好的方法吗?1通过数组,然后另一个循环插入位置?

p.S我知道这很容易。

<?php
    $arr = array(
        '0' => 'z1',
        '1' => 'Z10',
        '2' => 'z12',
        '3' => 'Z2',
        '4' => 'z3',
    );

    $new_arr = array();
    $temp = array();
    foreach($arr as $key=>$value)
    {

        if(empty($new_arr))
        {
        $new_arr[$key] = $value;
        }
        else
        {
            if(sanitizeValue($new_arr[$key-1]) > sanitizeValue($value))
            {
                foreach($new_arr as $key_p => $value_p)
                {
                    if(sanitizeValue($value) < sanitizeValue($value_p))
                    {
                        insert($new_arr, $key_p, array($key=>$value));
                    }


                }

            }
            else
            {
            $new_arr[$key] = $value;
            }
        }

    }

     function insert($array, $index, $val)
       {
          $temp = array(); // this temp array will hold the value 
          $size = count($array); //because I am going to use this more than one time
         //echo $size; echo $index;
           if (!is_int($index) || $index < 0 || $index > $size)
           {
               return -1;
           }
           else
           {
               $temp   = array_slice($array, 0, $index);
               $temp[] = $val;
               return array_merge($temp, array_slice($array, $index, $size));
           }
       }

    function sanitizeValue($str)
    {
    $str = filter_var($str, FILTER_SANITIZE_NUMBER_INT);
    return $str;
    }
    echo '<pre>';
    print_r($new_arr);
    echo '</pre>';
    ?>

每当您需要对数组进行排序时,都应该查看"排序数组"的手动页面,它有一个很棒的表,可以帮助您确定要使用哪个排序函数。

在这种情况下,您希望使用uasort()按值排序,但保留键,并使用strnatcasecmp()使用"自然"(人工风格)排序方法对值进行排序,这将允许您在1、2和3之后放置10,而不是默认情况下在1之后添加10,这是一种不区分大小写的方式(允许z1和Z10之间的差异等)。

示例:

uasort($example, function($a, $b) {
    return strnatcasecmp($a, $b);
});
Array
(
    [0] => z1
    [3] => Z2
    [4] => z3
    [1] => Z10
    [2] => z12
)