2016-07-12 6 views
0

Я пытаюсь переустановить многомерный массив на основе пользовательского упорядоченного ключа, поскольку я использую jQuery sortable plugin. Я читаю usort, ksort и другие, но они сортируются в нисходящем или восходящем порядке, но на пользовательском упорядоченном ключе. Я читал uasort bu Я не понимаю, как реализовать это.Как отсортировать многомерный массив по-своему

$original_array = 
    array(  
    'one' => array 
     (
      'url' => 'home.php', 
      'title' => 'Home', 
      'permission' => array 
        (
         'administrator' => yes, 
         'manager' => yes 
        ) 
     ), 
    'two' => array 
     (
      'url' => 'entries.php', 
      'title' => 'Entries', 
      'permission' => array 
       (
        'administrator' => yes, 
        'manager' => yes, 
       ) 

     ), 
     'three' => array 
     (
      'url' => 'stock.php', 
      'title' => 'Stock', 
      'permission' => array 
       (
        'administrator' => 'yes', 
        'manager' => 'yes', 
       ) 
     ), 
    'four' => array 
     (
      'url' => 'products.php', 
      'title' => 'Products', 
      'permission' => array 
       (
        'administrator' => yes, 
        'manager' => yes, 
       ) 
     ), 
     'five' => array 
     (
      'url' => 'prices.php', 
      'title' => 'Prices', 
      'permission' => array 
       (
        'administrator' => yes, 
        'manager' => yes, 
       ) 
     ), 
    ); 

массив подстраиваться как в таком порядке

$custom_array_to_be_arranged = 
    array(
     'three' => array 
     (
      'url' => 'stock.php', 
      'title' => 'Stock', 
      'permission' => array 
       (
        'administrator' => 'yes', 
        'manager' => 'yes', 
       ) 
     ), 
    'one' => array 
     (
      'url' => 'home.php', 
      'title' => 'Home', 
      'permission' => array 
        (
         'administrator' => yes, 
         'manager' => yes 
        ) 
     ),  
    'five' => array 
     (
      'url' => 'prices.php', 
      'title' => 'Prices', 
      'permission' => array 
       (
        'administrator' => yes, 
        'manager' => yes, 
       ) 
     ), 
    'two' => array 
     (
      'url' => 'entries.php', 
      'title' => 'Entries', 
      'permission' => array 
       (
        'administrator' => yes, 
        'manager' => yes, 
       ) 

     ), 
    'four' => array 
     (
      'url' => 'products.php', 
      'title' => 'Products', 
      'permission' => array 
       (
        'administrator' => yes, 
        'manager' => yes, 
       ) 
     ) 
    ); 

Любая помощь будет оценена. Благодарю.

+0

Как вы их планируете? То, как вы показали, выглядит почти случайным. Кроме того, jQuery относится к PHP-коду? –

+0

Привет, Да в соответствии с $ custom_array_to_be_arranged ключами. Я формирую $ custom_array_to_be_arranged, используя сортировку jQuery. – devdarsh

+0

Я ищу результат как $ custom_array_to_be_arranged – devdarsh

ответ

1

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

function customSort(array $newOrder, array $currentArray) 
{ 
    $new = []; 
    foreach($newOrder as $key) { 
     if (array_key_exists($key, $currentArray)) { 
      $new[$key] = $currentArray[$key]; 
     } 
    } 

    return $new; 
} 

Использование:

$newOrder  = ['three', 'one', .... ]; 
$currentArray = ['one' => ..., 'two' => ...]; 

$newSortedArray = customSort($newOrder, $currentArray); 

Таким образом, вы получите новый массив, отсортированный в том же порядке, что и $newOrder списка.

+0

Спасибо @Magnus Eriksson Кажется, это работа. Я попробую ваше решение. – devdarsh

+0

еще не пробовал. нужно работать над этим. Извините за мой плохой английский. Надеюсь, ваше решение будет работать – devdarsh

2

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

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

$custom_keys = array('three', 'one', 'five', 'two', 'four'); 

foreach ($custom_keys as $key) { 
    if (isset($original_array[$key])) { 
     $sorted[$key] = $original_array[$key];  
    } 
} 

Если вы хотите использовать функцию сортировки, а не создавать новый массив, используйте uksort и use пользовательский массив сортировки в вашем сравнении обратного вызова. Вы можете использовать array_search, чтобы найти правильный порядок для ключей.

$custom_keys = array('three', 'one', 'five', 'two', 'four'); 

uksort($original_array, function($a, $b) use ($custom_keys) { 
    $apos = array_search($a, $custom_keys); 
    $bpos = array_search($b, $custom_keys); 
    if ($apos < $bpos) return -1; 
    if ($apos > $bpos) return 1; 
    return 0; 
});