Как отсортировать ассоциативный массив, используя подполе вложенных ассоциативных массивов в PHP? - PullRequest
2 голосов
/ 31 марта 2011

Как я могу отсортировать ассоциативный массив по одному из его значений?

Например:

$arr = array(
    'ted' => array( 'age' => 27 ),
    'bob' => array( 'age' => 18 ),
    'jay' => array( 'age' => 24 )
);

$arr = ???

foreach ($arr as $person)
    echo $person['age'], ', ';

Так что вывод:

18, 24, 27

Этоэто упрощенный пример, чтобы продемонстрировать мой вопрос.

Мне все еще требуется, чтобы $arr был ассоциативным массивом.

Ответы [ 5 ]

7 голосов
/ 31 марта 2011

Это классический пример, когда анонимные функции PHP 5.3 пригодятся:

uasort($arr, function($a, $b) {
    return $a['age'] - $b['age'];
});

$a['age'] - $b['age'] - это маленький трюк .Это работает, потому что функция обратного вызова должна возвращать значение <0, если <code>$a меньше, чем $b, и значение> 0, если $a больше, чем $b.

7 голосов
/ 31 марта 2011

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

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

function callback($a, $b) {
  if ($a['age'] > $b['age']) {
    return 1;
  } else if ($a['age'] < $b['age']) {
    return -1;
  }
  return 0;
}


Используя эту функцию в следующей части кода:

$arr = array(
    'ted' => array( 'age' => 27 ),
    'bob' => array( 'age' => 18 ),
    'jay' => array( 'age' => 24 )
);

uasort($arr, 'callback');
var_dump($arr);

Вы получите этот результирующий массив:

array
  'bob' => 
    array
      'age' => int 18
  'jay' => 
    array
      'age' => int 24
  'ted' => 
    array
      'age' => int 27
1 голос
/ 31 марта 2011

Поскольку вы сортируете значение внутри подмассива, встроенной функции, которая будет выполнять 100% работы, нет. Я бы сделал пользовательскую сортировку с:

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

Вот пример функции сравнения, которая возвращает сравнение на основе этого значения во вложенном массиве

<?php
// Comparison function
function cmp($left, $right) {
    $age1 = $left['age'];
    $age2 = $right['age'];
    if ($age1 == $age2) {
        return 0;
    }
    return ($age1 < $age2) ? -1 : 1;
}

uasort($array, 'cmp');
1 голос
/ 31 марта 2011

http://www.php.net/manual/en/array.sorting.php

Этот конкретный случай будет включать использование одного из методов сортировки, которые используют обратный вызов для сортировки

0 голосов
/ 31 марта 2011

Вы не просто сортируете ассоциативный массив, вы сортируете ассоциативный массив ассоциативных массивов;)

A uasort вызов - это то, что вам нужно

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