2015-03-20 3 views
1
function mysort($arr) 
{ 
for ($i = 0; $i < count($arr); $i++) { 
    $j = $i; 
    while ($j > 0 && $arr[$j] < $arr[$j-1]) { 
     $tmp = $arr[$j-1]; 
     $arr[$j-1] = $arr[$j]; 
     $arr[$j] = $tmp; 
     $j--; 
    } 
} 

return $arr; 
} 

$array = array(
'a' => '1', 
'f' => '3', 
'g' => '5', 
's' => '2', 
'r' => '8' 
); 
$values = array_values($array); 

$sorted = array(); 
foreach (mysort($values) as $key=> $value) { 
$sorted[$value] = $array[$value]; 
} 

print_r($sorted); 

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

а = 1

s = 2

е = 3

г = 5

г = 8

однако я пытаюсь сделать это без использования каких-либо методов сортировки, такие как asort, usort или ksort. просто моя собственная функция.

+0

Я не могу понять ваш вопрос правильно. Можете ли вы, пожалуйста, прояснить мне. Благодарю вас. –

+3

Почему вы не хотите использовать такие методы? 'asort ($ array);' кажется намного проще. – rjdown

+0

массив, который встроен в код, я хочу сортировать по номерам, убывающим при сохранении ассоциаций и делать это без использования метода asort ($ array), который я допускаю, облегчает его. – DonLeo17

ответ

2

Это должно работать для вас:

Здесь я простой цикл по всем элементам $array и сохранить их сортируют в $sorted. В первом случае if я проверяю, является ли массив $sorted пустым ИЛИ текущий элемент $array больше, чем последний элемент отсортированного массива. Если это правда, я просто добавляю элемент в конец к массиву $sorted.

E.g. (Псевдо-код):

empty($sorted) || end($sorted) < current($array) 

В противном случае я ввожу еще часть, где я цикл через $sorted массив, чтобы найти место, где текущий элемент $sorted меньше текущего элемента $array И следующий элемент $sorted больше, чем текущий элемент $array (так сказать, чтобы найти место, где текущий элемент $array должен пройти между ними).

например (псевдо-код):

current($sorted) < current($array) && next(current($sorted)) > current($array) 

И если это так, я первый отрезать часть от текущего элемента массива $sorted и сохранить его в переменной TMP. Затем я добавляю текущий элемент из $array, а затем добавлю часть, которую я отрезаю снова в конце массива $sorted.

<?php 

    $array = [ 
      'a' => '1', 
      'r' => '8', 
      'g' => '5', 
      'f' => '3', 
      's' => '2', 



    ]; 

    $sorted = []; 
    $keys = array_keys($array); 


    for($count = 0; $count < count($array); $count++) { 

     $tmpKeys = array_keys($sorted); 
     if(empty($sorted) || $sorted[$tmpKeys[count($sorted)-1]] < $array[$keys[$count]]) { 
      $sorted[$keys[$count]] = $array[$keys[$count]]; 
     } else { 

      for($innerCount = 0; $innerCount < count($sorted)-1; $innerCount++) { 

       if($sorted[$tmpKeys[$innerCount]] < $array[$keys[$count]] && $array[$keys[$count]] < $sorted[$tmpKeys[$innerCount+1]]) { 
        $tmp = array_splice($sorted, $innerCount+1); 
        $sorted[$keys[$count]] = $array[$keys[$count]]; 
        $sorted = array_merge($sorted, $tmp); 
       } 

      } 
     } 

    } 

    print_r($array); 
    print_r($sorted); 

?> 

Выход:

Array ([a] => 1 [r] => 8 [g] => 5 [f] => 3 [s] => 2) 
Array ([a] => 1 [s] => 2 [f] => 3 [g] => 5 [r] => 8) 
Смежные вопросы