2010-07-08 3 views
3

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

Array 
(
    [Places] => Array 
     (
      [public] => 0 
      [entities] => Array 
       (
        ... 
       ) 
     ) 
    [Issues] => Array 
     (
      [public] => 1 
      [entities] => Array 
       (
        ... 
       ) 
     ) 

    [Source] => Array 
     (
      [public] => 0 
      [entities] => Array 
       (
        ... 
       ) 
     ) 
) 

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

Любые идеи были бы очень благодарны!

ответ

4
usort($array, function ($a, $b) { return $a["public"] - $b["public"]; }); 
+0

Это в основном работает, но я теряю ключи «места», «Вопросы» и «Источник» Любые предложения? – Lizard

+0

@Liz Замените 'uasort'. – Artefacto

+0

Спасибо, только сейчас проблема в том, что я теряю все элементы в «сущности» для каждого «Места», «Проблемы» и «Источник». Это исправление? – Lizard

0

смотреть на это, используя array_multisort:

$test = array(
     'Places' => array(
      'public' => 0, 
      'entities' => array(

      ) 
     ), 
     'Issues' => array(
      'public' => 1, 
      'entities' => array() 
     ), 
     'Source' => array(
      'public' => 0, 
      'entities' => array() 
     ) 
    ); 

    echo '<pre>'; 
    print_r($test); 
    echo '</pre>'; 

    array_multisort($test,SORT_ASC,$test); 

    echo '<pre>'; 
    print_r($test); 
    echo '</pre>'; 
1

Вот интересная ссылка: http://www.the-art-of-web.com/php/sortarray/

Я бы попробовать

usort(usort(array, function), function); 

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

0

Общий способ сделать это с помощью array_multisort - это разместить значение сортировки в своем собственном массиве, а затем отсортировать оба массива, используя это как основной массив сортировки.

Попробуйте следующее:

$test = array(
    'Places' => array(
     'public' => 0, 
     'entities' => array(

     ) 
    ), 
    'Issues' => array(
     'public' => 1, 
     'entities' => array() 
    ), 
    'Source' => array(
     'public' => 0, 
     'entities' => array() 
    ) 
); 

echo '<pre>'; 
print_r($test); 
echo '</pre>'; 

$sort = array(); 
foreach ($test as $k => $a) { 
    $sort[$k] = $a['public']; 
} 

// placing $sort first in array_multisort causes $test to be sorted in same order as the values in $sort 
array_multisort($sort,SORT_ASC,$test); 

echo '<pre>'; 
print_r($test); 
echo '</pre>'; 
0

Вы можете использовать usort с функцией обратного вызова.

function cmp($a, $b) { 
    return $a['public'] == $b['public'] ? 0 : $a['public'] > $b['public'] ? 1 : -1; 
} 

usort($array, "cmp"); 
0

Попробуйте это:

$code = "return (-1*strnatcmp(\$a['public'], \$b['public']));"; 
uasort($array, create_function('$a,$b', $code));