排序数组,同时保留索引

时间:2015-03-30 02:29:36

标签: php arrays

我需要转换

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有更好的方法,然后做2循环? 1通过数组然后另一个循环到位置插入?

P.S我知道asort很容易。

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

    ?>

1 个答案:

答案 0 :(得分:1)

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

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

Example:

uasort($example, function($a, $b) {
    return strnatcasecmp($a, $b);
});

Array
(
    [0] => z1
    [3] => Z2
    [4] => z3
    [1] => Z10
    [2] => z12
)