2014-10-31 3 views
0

У меня есть простой массив. Цель состоит в том, чтобы сортировать их по возрастанию по ключу.Сортировка массива по ключу (клавиша - строка)

$someUnsortedArray = array("140/142" => "FirstValue", "118/120" => "SecondValue", "122/124" => "ThirdValue", "40/42" => "FourthValue"); 

ksort($someUnsortedArray); 

Мой выход:

array (size=4) 
    '118/120' => string 'SecondValue' 
    '122/124' => string 'ThirdValue' 
    '140/142' => string 'FirstValue' 
    '40/42' => string 'FourthValue' 

Ожидаемый результат:

array (size=4) 
'40/42' => string 'FourthValue' 
'118/120' => string 'SecondValue' 
'122/124' => string 'ThirdValue' 
'140/142' => string 'FirstValue' 

Что функция в PHP Я ищу?

ответ

5

Вы можете использовать uksort() в этом случае:

$someUnsortedArray = array("140/142" => "FirstValue", "118/120" => "SecondValue", "122/124" => "ThirdValue", "40/42" => "FourthValue"); 

uksort($someUnsortedArray, function($a, $b){ 
    $a = str_replace('/', '', $a); 
    $b = str_replace('/', '', $b); 
    return $a - $b; 
}); 

echo '<pre>'; 
print_r($someUnsortedArray); 
+0

В теории это будет работать .. Но есть ли решение без замены "/"без ничего? – Tyralcori

+0

@Tyralcori вам нужно отсортировать его по обычаю, так как вы не получите желаемые значения, если они будут сравниваться как строки – Ghost

+0

@Tyralcori, если вы не хотите заменять, вы можете взорвать его – Ghost

2

Проверка PHP Manual:

http://php.net/manual/en/function.ksort.php

Используйте ksort() с SORT_NUMERIC флагом.

$someUnsortedArray = array("140/142" => "FirstValue", "118/120" => "SecondValue", "122/124" => "ThirdValue", "40/42" => "FourthValue"); 
ksort($someUnsortedArray, SORT_NUMERIC); 

echo '<pre>'; 
print_r($someUnsortedArray); 

Sample Output

+0

Tyralcori уже пробовал ksort;) – Veve

+0

что насчет SORT_NUMERIC –

+0

«40/42» или «118/120» не являются числовыми значения, они являются строками. – Veve

0

Используйте функцию uksort и передать функции пользовательской функции/метода, который будет делать правильные преобразования в зависимости от потребностей.

Вот страница PHP руководства для его функционирования uksort http://php.net/manual/en/function.uksort.php

0

Результат является ожидаемого поведения, так как при сортировке строк в алфавитном порядке 1 * всегда перед 4 *.

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

Реализация зависит от того, чего вы хотите достичь. Просто список ключей? Затем вы можете выполнять итерацию в цикле foreach, например, при нажатии клавиш.

Не будет функции «вне коробки» PHP.

2

В качестве альтернативы, вы можете также использовать строки естественного порядка функции сравнения сравнить ключи

function sortKey($a, $b) { 
    return strnatcmp($a, $b); 
} 

uksort($someUnsortedArray,"sortKey"); 
0
$someUnsortedArray = array("5/142" => "FirstValue", "118/120" => "SecondValue", "122/124" => "ThirdValue", "40/42" => "FourthValue"); 

uksort($someUnsortedArray, function($a, $b) { 
    // to avoid manipulating them as a string ....  
    return ((float)$a)-((float)$b); 
}); 
var_dump($someUnsortedArray); 
Смежные вопросы