2013-03-28 3 views
0

Мне нужна помощь в сортировке ассоциативного массива с PHP.PHP sort array с тремя переменными

Сортировка должна основываться на имени массива «имя» и содержать пары ключ/значение. После того, сортировка: 1) первый целое число ASC, 2) второй целое ASC, 3) третий смешанный ASC

вход

array(6) { 
    [0]=> 
    array(2) { 
    ["name"]=> 
    string(13) "60 to 90 in 6" 
    ["timing"]=> 
    float(4.7) 
    } 
    [1]=> 
    array(2) { 
    ["name"]=> 
    string(15) "40 to 120 in KD" 
    ["timing"]=> 
    float(3.3) 
    } 
    [2]=> 
    array(2) { 
    ["name"]=> 
    string(14) "60 to 100 in 4" 
    ["timing"]=> 
    float(1.5) 
    } 
    [3]=> 
    array(2) { 
    ["name"]=> 
    string(13) "60 to 90 in 4" 
    ["timing"]=> 
    float(2.4) 
    } 
    [4]=> 
    array(2) { 
    ["name"]=> 
    string(15) "140 to 160 in 6" 
    ["timing"]=> 
    float(2.4) 
    } 
    [5]=> 
    array(2) { 
    ["name"]=> 
    string(13) "60 to 90 in KD" 
    ["timing"]=> 
    float(5.7) 
    } 
} 

порядок вывода

1, 3, 0, 5, 2, 4

Большое спасибо за помощь.


Ответ:

uasort($acceleration, function($a, $b) {  
    if($a['_sort'][0] == $b['_sort'][0] AND $a['_sort'][2] == $b['_sort'][2]) 
    {      
     if($a['_sort'][4] < $b['_sort'][4]) 
      return -1; 
     elseif($a['_sort'][4] > $b['_sort'][4]) 
      return 1; 
     else 
      return 0; 
    } 
    elseif($a['_sort'][0] == $b['_sort'][0]) 
    { 
     if($a['_sort'][2] < $b['_sort'][2]) 
      return -1; 
     elseif($a['_sort'][2] > $b['_sort'][2]) 
      return 1; 
     return 0; 
    } 
    else 
    { 
     if($a['_sort'][0] < $b['_sort'][0]) 
      return -1; 
     elseif($a['_sort'][0] > $b['_sort'][0]) 
      return 1; 
     else 
      return 0; 
    } 
}); 

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

+0

Где мой код? Что вы сделали до сих пор? Мы можем попытаться помочь вам с вашим кодом, но мы не можем написать его для вас. – Uby

ответ

0

Вам нужны массивы этого массива после сортировки с помощью uasort(). Функция сравнения (замыкание) должна быть легко записана.

+0

Поскольку вы будете использовать строчную обработку для сравнения, вам может понадобиться кэшировать «значение» значений «имя», если вы ожидаете большой объем данных: перед сортировкой вставьте каждому элементу 3 значения, необходимые для сортировки, например. для первого добавьте массив '_sort' => (60,90, '6'), второй массив '_sort' => (40,120, 'KD') ... –

+0

Thx для входов. – aebersold

0

Вы должны использовать usort(), который позволяет использовать пользовательскую функцию comarison для сортировки. Таким образом, вы должны реализовать функцию, которая сравнивает поля neme и возвращает -1,0 или 1 значение в зависимости от результата (меньше, тогда равно или больше). Эта функция может использовать регулярное выражение, чтобы получить три значения из поля strng name, а затем сравнить их с использованием ваших условий.

+0

Два плохих совета в строке. Во-первых, usort() не поддерживает ключи, что было бы результатом.Во-вторых, не используйте regexp; особенно не для строк, которые этого не требуют; если вы уверены в строках очень фиксированного формата, перейдите в explode(). –

0
<?php 

$acceleration = array(); 
$acceleration[0]= array("name" => "60 to 90 in 6", "timing" => 4.7); 
$acceleration[1]= array("name" => "40 to 120 in KD", "timing" => 3.3); 
$acceleration[2]= array("name" => "60 to 100 in 4", "timing" => 1.5); 
$acceleration[3]= array("name" => "60 to 90 in 4", "timing" => 2.4); 
$acceleration[4]= array("name" => "140 to 160 in 6", "timing" => 2.4); 
$acceleration[5]= array("name" => "60 to 90 in KD", "timing" => 5.7); 


function comp_maker($key) { 
    return function ($a, $b) use ($key) {  // closure for uasort() to use 
     return strnatcmp($a[$key], $b[$key]); // comp by "natural order" 
    }; 
} 

uasort($acceleration, comp_maker('name')); 

// display sorted array's keys 
$str = ''; 
foreach ($acceleration as $key => $value){ 
    $str .= ", $key"; 
} 
echo substr($str,1); 

// output: 1, 3, 0, 5, 2, 4 

Вы также можете посмотреть на код here

Это решение следует совету мудреца о применении uasort(), который является более подходящим, чем usort(), так как он сохраняет ключ-значение объединения массива. Без этих результатов результаты будут следующими: 0,1,2,3,4,5, которые скрывают, как был переупорядочен исходный массив.

Обратите внимание, что второй параметр для uasort() будет оцениваться как замыкание в результате вызова функции comp_maker(). uasort(), в свою очередь, вызовет закрытие, чтобы он мог выполнить сравнение. Сортировка происходит в соответствии с «человеческим порядком» с помощью strnatcmp(), поэтому значения отображаются в порядке возрастания, как и следовало ожидать.

Для получения результатов я мог бы использовать array_keys(), но вместо этого вместо этого вместо того, чтобы избежать накладных расходов на вызов функции, итерируя через массив, используя синтаксис key, value, выводит новый порядок ключей отсортированного массива.

Смежные вопросы