2013-11-21 9 views
2

Оригинальный массив:Как отсортировать многомерный массив по значению?

$resolutions = array (
     "Desktop monitor" => array (
      //Standard 4:3 
      "800x600" => "800x600", 
      "1024x768" => "1024x768", 
      "1600x1200" => "1600x1200", 
      //Wide 16:10 
      "960x600" => "960x600", 
      "1280x800" => "1280x800", 
      "1440x900" => "1440x900", 
      "1680x1050" => "1680x1050", 
      "1920x1200" => "1920x1200", 
     ), 
     "Apple" => array (
      "DeviceX" => "2048x1536", 
      "DeviceY" => "1024x768", 
     ), 
); 

Wanted массив:

$resolutions = array (
     "Desktop monitor" => array (
      "800x600" => "800x600",//Standard 4:3 
      "960x600" => "960x600",//Wide 16:10 
      "1024x768" => "1024x768",//Standard 4:3 
      "1280x800" => "1280x800",//Wide 16:10 
      "1440x900" => "1440x900",//Wide 16:10 
      "1600x1200" => "1600x1200",//Standard 4:3 
      "1680x1050" => "1680x1050",//Wide 16:10 
      "1920x1200" => "1920x1200",//Wide 16:10 
     ), 
     "Apple" => array (
      "DeviceY" => "1024x768", 
      "DeviceX" => "2048x1536", 
     ), 
); 

То, что я пробовал:

foreach ($resolutions as $screen => $resolution) { 
     foreach($resolution as $key => $val) { 
      $newarray[$key] = $row[$val]; 
     } 
     array_multisort($newarray, SORT_DESC, $resolution); 
    } 

Я думал, что я на полпути до конца , но приведенный выше код дал мне ome non sense (для меня), то есть: сначала идет разрешение 1024x768, затем 1280x800, затем 1440x900 и, в конце концов, 800x600.

ответ

1

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

foreach ($resolutions as &$resolution) 
    uasort($resolution, function ($a, $b) { return array_product(explode('x', $a)) - array_product(explode('x', $b)); }); 
0

Это быстрый хак, специально предназначенный для ключа массива Desktop monitor. ksort будет сортировать по ключевому элементу массива, но он не сортируется, когда у вас есть x в середине некоторых чисел. Вот мое решение:

  • Перебор массива
  • Построить новый массив только с первой половины резолюции как массив ключевых
  • Используйте ksort сортировать новый массив
  • array_walk новый массив, чтобы создать выходной массив, который выглядит как оригинальный
  • выход оригинала:

https://eval.in/71433

Вы можете сделать то же самое для других массивов внутри вашего исходного массива, например. Apple, используя значение вместо ключа в качестве разрешения, и положите array_walk и т. Д. Внутри петли.

0

Просто глядя на то, что вы положили там, две вещи, которые выделяются:

  • Вы перекручивание через внешний массив и сортировка одномерный массив, используя Multisort; Я бы рекомендовал использовать asort().
  • Не совсем уверен, что происходит там, где $ resolution передается как параметр thrid. Он хочет массив флажков сортировки.

попробовать:

foreach ($resolutions as $resolution) { 
     asort($resolution); 
    } 
Смежные вопросы