Сортировка массива 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
Я написал эту функцию и теперь вспомнил, что она у меня есть (вот почему я действительно не помню, что я делаю в ней, хотя на самом деле она работает должным образом и, надеюсь, есть и комментарии), надеюсь, вам понравится:)
Похоже, ваша проблема в том, что вы меняете "временных" персонажей $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);