Сортировка массива PHP без ксорта

Я пытаюсь вручную отсортировать массив PHP без использования ksort.

Вот как выглядит мой код на данный момент:

function my_ksort(&$arg){
    foreach($arg as $key1 => $value1){
      foreach($arg as $key2 => $value2){
        if($key1 > $key2){
          $aux = $value2;
          $arg[$key2] = $value1;
          $arg[$key1] = $aux;
        }
      }
    }
}

Это не сортирует, я не могу понять, как сделать это сортировать.

5 ответов

Решение

Вы можете попробовать это:

function my_ksort(&$arg)
    {
    $keys=array_keys($arg);
    sort($keys);
    foreach($keys as $key)
        {
        $val=$arg[$key];
        unset($arg[$key]);
        $arg[$key]=$val;
        }
    }

Я сортирую ключи по отдельности, а затем удаляю элементы по одному и добавляю их в конец в порядке возрастания.

Я использую другую функцию сортировки (sort()), но если вы хотите исключить из эмуляции все доступные функции сортировки, sort() намного легче подражать. На самом деле, алгоритм @crypticous делает именно это!

Коротко и сладко

function custom_ksort($arg)
{
    $keys = array_keys($arg);

    sort($keys);

    foreach($keys as $newV)
    {
        $newArr[$newV] = $arg[$newV];
    }

    return $newArr;
}

Я проверял некоторые проблемы, связанные с этим постом, и я хотел бы высказать свое мнение об этом! вот что я бы сделал, чтобы реализовать сортировку php:

$array_res = array();
$array = array(50,25,98,45);
$i=0;

 $temp = $array[0];
 $key = array_search($temp, $array);
while ($i<count($array)-1){

     $temp = $array[0];
    for($n=0;$n<count($array) ;$n++)
    {

        if($array[$n]< $temp && $array[$n] != -1 )
        {

             $temp = $array[$n];

        }
        else{continue;}
    }
//get the index for later deletion
$key = array_search($temp, $array);



array_push($array_res, $temp);
/// flag on those which were ordered
$array[$key] =-1;

$i++;
}

// lastly append the highest number 

for($n=0;$n<count($array) ;$n++)
        {
            if ($array[$n] != -1)

            array_push($array_res, $array[$n]);

        }
// display the results
print_r($array_res);

Этот код будет отображаться: Массив ( [0] => 25 [1] => 45 [2] => 50 [3] => 98)

Эта функция возвращает массив в ASC. Примите во внимание, что я использую goto, который поддерживается в (PHP 5 >= 5.3.0)

function ascending_array($array){
    if (!is_array($array)){
        $array = explode(",", $array);
    }

    $new = array();
    $flag = true;

    iter:
        $array = array_values($array); // recount array values with new offsets

        (isset($min["max"])) ? $min["value"] = $min["max"] : $min["value"] = $array[0];
        $min["offset"] = 0;

        for ($i=0;$i<count($array);$i++){
            if ($array[$i] < $min["value"]){ // redefine min values each time if statement executed
                $min["value"] = $array[$i];
                $min["offset"] = $i;
            }

            if ($flag){ // execute only first time
                if ($array[$i] > $min["value"]){ // define max value from array
                    $min["max"] = $array[$i];
                }
                $flag = false;
            }

            if ($i === (count($array)-1)){ // last array element
                array_push($new,$min["value"]);
                unset($array[$min["offset"]]);
            }
        }

    if (count($array)!=0){
        goto iter;
    }
    print_r($new);
}

$arr = array(50,25,98,45);

ascending_array($arr); // 25 45 50 98

PS. Когда я учился phpЯ написал эту функцию и теперь вспомнил, что она у меня есть (вот почему я действительно не помню, что я делаю в ней, хотя на самом деле она работает должным образом и, надеюсь, есть и комментарии), надеюсь, вам понравится:)

DEMO

Похоже, ваша проблема в том, что вы меняете "временных" персонажей $key1 а также $key2 но не фактические массивы. Вы должны изменить $arg, не просто $key1 а также $key2, Попробуйте что-то вроде:

$arr = Array(3=>"a",7=>"b");
print_r( $arr );
foreach( $arr as $k=>$v ){
    unset($arr[$k]);
    $arr[$k+1] = $v;
}
print_r($arr);
Другие вопросы по тегам