2013-11-21 147 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", 
     ), 
); 

通缉阵列:

$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没有意义(对我来说),即:先分辨率为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()。
  • 不太确定那里发生了什么,以第三个参数传入$决议。它想要一个排序标志数组。

尝试:

foreach ($resolutions as $resolution) { 
     asort($resolution); 
    }