2013-04-14 3 views
4

удается найти правильную функцию для сортировки многомерного массива следующим образом:Как использовать array_multisort() на многомерный массив

Array( [0] => Array  (
      [username] => 123   
      [name]  => Name  
      [address]  => array (
           [line1] => address line 1 
           [line2] => address line 2 
           [postcode] => postcode 
          ), 
     [1] => Array  (
      [username] => 1234   
      [name]  => Name  
      [address]  => array (
           [line1] => address line 1 
           [line2] => address line 2 
           [postcode] => postcode 
          ) 
) 

Я хочу, чтобы отсортировать выше массив элементом в адресном массиве() ,

Мне известно о функции array_multisort, которая будет легко сортироваться либо по имени пользователя, либо по адресу, но просто не может определить, как сортировать, используя поле другого уровня вниз.

Любая помощь будет высоко ценится

Благодаря

+0

Вы должны использовать 'usort()' вместо этого, на самом деле – zerkms

+0

@zerkms, что это неправильно. Построение массива сортировки решает его без ограничения. См. № 3 по адресу http://php.net/manual/en/function.array-multisort.php – Teson

+0

usort примерно в 10 раз медленнее, см. Ниже. – Teson

ответ

3

Просто понял, как достичь его ...

Сначала нужно извлечь данные, которые мы хотим разобраться в отдельный массив перед отправкой функция

Пример array_multisort():

foreach(Array() as $key=>$value) { 
    $sort_data[$key] = $value['address']['postcode']; 
} 

array_multisort($sort_data, SORT_DESC, Array()); 

Исходный массив() теперь будет отсортирован в зависимости от значения почтового индекса и любого фильтра SORT, предоставленного функции array_multisort().

2

С помощью этого решения вам не нужно делать дополнительные препараты, чтобы получить результат:

$result = usort($data, function($a, $b) { 
    return strcmp($a['address']['postcode'], $b['address']['postcode']); 
}); 

array_multisort цель состоит в том, чтобы отсортировать несколько различных массивов одновременно. Если нужно отсортировать только один исходный массив - следует использовать usort().

0

FYI, для поддержки как строковой, так и цифровой сортировки usort заканчивается примерно в 10 раз медленнее.

$rs[] = array('username'=>'bla bla..','Logins'=>124); 
$rs[] ... 

usort($rs,function($a,$b) { 
    $i = 'Logins'; 
    if (is_numeric($a[$i])) { 
    return $a[$i] > $b[$i]; 
    } else { 
    return strcmp($a[$i],$b[$i]); 
    } 
}); 

против

$orderBy = 'Logins'; 
$sort = array(); 
foreach($rs as $key=>$rec) $sort[$key] = $rec[$orderBy]; 
array_multisort($sort,SORT_ASC,$rs); 

демо

<?php 
 
$rs = array(); 
 
$rs[] = array('adam','cederblom',50); 
 
$rs[] = array('denny','bengtsson',9); 
 
$rs[] = array('beata','andersson',30); 
 
$rs[] = array('adam','cederblom',50); 
 
$rs[] = array('denny','bengtsson',9); 
 
$rs[] = array('beata','andersson',30); 
 
$rs[] = array('adam','cederblom',50); 
 
$rs[] = array('denny','bengtsson',9); 
 
$rs[] = array('beata','andersson',30); 
 
$rs[] = array('adam','cederblom',50); 
 
$rs[] = array('denny','bengtsson',9); 
 
$rs[] = array('beata','andersson',30); 
 
$data = array_merge($rs,$rs); 
 

 
$orderBy = 2; \t //0 - 2 
 
//please note that usort doesn't use global, so update $i 
 

 
echo 'Usort: '; 
 
$start = microtime(true); 
 
for($j=0;$j<1000;$j++) { 
 
    //revert to unsorted. 
 
    $rs = $data; 
 
    usort($rs,function($a,$b) { 
 
    $i = 2; \t //should be same as orderBy.. 
 
    if (is_numeric($a[$i])) { 
 
     return $a[$i] > $b[$i]; 
 
    } else { 
 
     return strcmp($a[$i],$b[$i]); 
 
    } 
 
    }); 
 
} 
 
echo microtime(true) - $start . '<hr/>'; 
 
foreach($rs as $rec) { 
 
    echo serialize($rec) . '<hr/>'; 
 
} 
 

 
echo 'Multisort: '; 
 
$start = microtime(true); 
 
for($j=0;$j<1000;$j++) { 
 
    //revert to unsorted. 
 
    $rs = $data; 
 
    $sort = array(); 
 
    foreach($rs as $key=>$rec) { 
 
    //demo, numeric index in record 
 
    $sort[$key] = $rec[$orderBy]; 
 
    } 
 
    array_multisort($sort,SORT_ASC,$rs); 
 
} 
 
echo microtime(true) - $start . '<hr/>'; 
 
foreach($rs as $rec) { 
 
    echo serialize($rec) . '<hr/>'; 
 
}

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