2013-07-26 21 views
0

У меня есть массив массивов следующим образом:Сортировка массива массивов по значению

Array(
    [id1] => Array (
      /* details */ 
      [unique] => 3 
     ) 
    [id2] => Array (
      /* details */ 
      [unique] => 5 
    [id3] => Array (
      /* details */ 
      [unique] => 1 
    ) 
) 

Вопрос: Как я мог сортировать ее по unique полю, так что он преобразуется как один следующий ?

Array(
    [id2] => Array (
      /* details */ 
      [unique] => 5 
     ) 
    [id1] => Array (
      /* details */ 
      [unique] => 3 
    [id3] => Array (
      /* details */ 
      [unique] => 1 
    ) 
) 
+0

http://stackoverflow.com/ вопросы/2699086/sort-multidimensional-array-by-value-2 – Ryan

+1

ht tp: //stackoverflow.com/questions/96759/how-do-i-sort-a-multidimensional-array-in-php – Ryan

+0

http://stackoverflow.com/questions/2282013/php-array-multiple-sort- by-value-then-by-key – Ryan

ответ

4

Классическая задача для функции usort:

<?php 
$data = array(
    "id1" => Array (
     "unique" => 3 
     ), 
    "id2" => Array (
     "unique" => 5), 
    "id3" => Array (
     "unique" => 1 
     ), 
    ); 

function cmp($a, $b) 
// {{{ 
{ 
    if ($a["unique"] == $b["unique"]) { 
     return 0; 
    } 
    return ($a["unique"] < $b["unique"]) ? 1 : -1; 
} 
// }}} 

usort($data, "cmp"); 
var_dump($data); 

Печать:

array(3) { 
    [0]=> 
    array(1) { 
    ["unique"]=> 
    int(5) 
    } 
    [1]=> 
    array(1) { 
    ["unique"]=> 
    int(3) 
    } 
    [2]=> 
    array(1) { 
    ["unique"]=> 
    int(1) 
    } 
} 

http://www.php.net/manual/en/function.usort.php

0

используя мои пользовательские функции вы можете сортировать массив

function multisort (&$array, $key) { 
    $sorter=array(); 
    $ret=array(); 
    reset($array); 
    foreach ($array as $ii => $va) { 
     $sorter[$ii]=$va[$key]; 
    } 
    asort($sorter); 
    foreach ($sorter as $ii => $va) { 
     $ret[$ii]=$array[$ii]; 
    } 
    $array=$ret; 
} 

multisort ($your_array,"order"); 
0

С помощью usort():

$array = array(
    "id1" => array("unique" => 3), 
    "id2" => array("unique" => 5), 
    "id3" => array("unique" => 1), 
); 

usort($array, function ($a, $b){ 
    if ($a['unique'] == $b) { 
     return 0; 
    } 
    return ($a['unique'] > $b['unique']) ? -1 : 1; 
}); 

print_r($array); 

Выходы:

Array 
(
    [0] => Array 
     (
      [unique] => 5 
     ) 
    [1] => Array 
     (
      [unique] => 3 
     ) 
    [2] => Array 
     (
      [unique] => 1 
     ) 
) 
0

Я чувствую, что я повторяюсь, извините: D

Не стесняйтесь смотреть на библиотеки из рамок.

[CakePHP] сделал классный класс, который может перемещаться по массивам с использованием строковой в точечной синтаксической нотации. Эта библиотека известна как Hash, просто посмотрите на нее.

Метод Sort используется для сортировки массива с ключами и значениями в зависимости от того, что вы ввели в атрибут «путь». Он более полезен, чем другие функции, поскольку он сортирует массив по , сохраняя индексы и все остальные значения, содержащиеся в этом массиве, включая более объемные подматрицы.

Для примера:

$array = array(
    'id1' => array (
     'unique' => 3, 
    ), 
    'id2' => array (
     'unique' => 5, 
    ), 
    'id3' => Array (
     'unique' => 1, 
    ), 
); 

Просто напишите это:

/** 
* First param: the array 
* Second param : the "path" of the datas to save. 
* "{s}" means "Matching any kind of index", for you to sort ALL indexes matching 
* the dot "." is used to navigate into the array like an object 
* And "unique" is the key which you want to be sorted by its value 
* The third param is simply the order method, "ascending" or "descending" 
*/ 
$sorted_array = Hash::sort($array, '{s}.unique', 'asc'); 

И $sorted_array будет равна этому:

array (
    'id3' => array (
     'unique' => 1, 
    ), 
    'id1' => array (
     'unique' => 3, 
    ), 
    'id2' => array (
     'unique' => 5, 
    ), 
); 
Смежные вопросы