2012-07-04 6 views
0

Я пытаюсь выяснить самый быстрый способ сортировки этого массива (т. Е. Производительности).Самый быстрый способ сортировки этого массива

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

$results = array(array('foo', '=', '1'), array('dog', '!=', '5'), array('apple', '<', '4')); 

После сортировки Шоуда выглядеть ...

$results = array(array('apple', '<', '4'), array('dog', '!=', '5'), array('foo', '=', '1')); 

Любые идеи? Функция

+1

Вы попробовали ksort? – drupality

+0

ksort не поможет здесь, поскольку он сортирует строки (по ключам), а не массивы – alfasin

+0

ему нужно использовать usort – alfasin

ответ

0

Рода() просто работал, как вы хотите:

<?php 
$results = array(array('foo', '=', '1'), array('dog', '!=', '5'), array('apple', '<', '4')); 
sort($results); 
//$results is now what you want 
?> 

Проверено на 5.2.17

+0

blimey справа! это надежный? – fire

+0

Конечно! функция sort() PHP не была изменена с PHP 5 и с использованием Quicksort, который является самым известным алгоритмом сортировки. Кроме того, если ваш первый ключ не является строкой, и вы хотите сравнить его как строку, вы можете использовать sort ($ array, SORT_STRING). Вы можете прочитать это для получения дополнительной информации: http://php.net/manual/en/function.sort.php. Я не уверен, но сортировка может узнать, все ли элементы массива, и если они есть, они сортируются сначала, затем второй, затем третий, затем ... затем последний элемент ... – niconoe

+0

интересно, я не думал ' sort' был бы способен, если бы было несколько массивов, поэтому я даже не попробовал LOL – fire

0

Вы можете обнаружить, что array_multisort является то, что вам нужно:

<?php 
     $sort_array = array(); 

     foreach($results as $key => $sub_array){ 
       $sort_array[$key] = $sub_array[0];//fill the sort array with the values you want to sort on 
     } 

     array_multisort($sort_array, $results); 
?> 

Функция array_multisort сортирует первый заданный массив и затем использует порядок ключей для сортировки второго массива. Возможно, вы можете создать массив сортировки в том же цикле, который создает исходный набор результатов.

Смотрите здесь для получения дополнительной информации: http://php.net/manual/en/function.array-multisort.php

0

usort и Multisort относительно медленно - которая становится боль> 100 K записей. Однако сила PHP - это ассоциативные массивы. Просто создайте индекс, основанный на этой основной функции, и примените быстрый ksort на основе этого. Вот что я имею в виду:

function array_index($dataarr,sortingkeyfields){ 
    $indexarr=array(); 
    sortingkeyfieldsnr=count(sortingkeyfields); 
    foreach($dataarr as $key=>$valarr) { 
    $currentindex=''; 
    foreach(sortingkeyfieldspos=0;sortingkeyfieldspos<sortingkeyfieldsnr;sortingkeyfieldspos++) $currentindex.= $valarr[sortingkeyfieldspos].'_'; 
    $indexarr[$currentindex]=$key; 
    } 
    return $indexarr; 
} 
function array_sortbyindex(&$dataarr,$indexarr,$issortindexbykey=true){ 
    // assumes complete index!: each item of indexarr must correlate a key of dataarr 
    $resultarr=array(); 
    if($issortindexbykey) ksort($indexarr); 
    foreach($indexarr as $datakey) $resultarr[$datakey]= $dataarr[$datakey]; 
    return $resultarr; 
} 

sortingkeyfields=array(0,2); 
print_r(array_sortbyindex($dataarr, array_index($YOURARRAY,sortingkeyfields))); 
Смежные вопросы