通过划界字符串值的2D数组的每个子阵列

问题描述 投票:0回答:4

原始阵列:

$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); }

我以为我已经结束了一半,但是上面的代码给了我一些不觉得(对我而言),即:第一次分辨率1024x768,然后是1280x800,其次是1440x900,最后是800x600.

php arrays sorting multidimensional-array
4个回答
1
投票
问题是您按字母顺序排序。您需要计算每个分辨率的大小才能正确对它们进行排序。这将需要编写一个自定义比较功能,以计算分辨率大小并比较它们。

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


只是看着您放在那里的东西,两件事脱颖而出:

0
投票

您在外部阵列中循环并使用MultiSort对单维数组进行排序;我建议只使用Asort()。

不确定在那里发生了什么,$分辨率将作为THRID参数传递。它想要一系列排序标志。
    try:
  • foreach ($resolutions as $resolution) { asort($resolution); }

这是一个专门针对

Desktop monitor
数组键的快速黑客。 
ksort

0
投票
x

时,它并不顺利。这是我的解决方案:


环通过阵列
构建新数组,仅分辨率的前半部分作为数组键
使用

ksort
    排序新阵列
  • array_walk
  • 新数组创建看起来像原始
  • 的输出数组
    您可以为原始数组中的其他阵列做同样的事情,例如
    Apple
  • 通过使用
  • 值代替
    键作为分辨率,然后将
    array_walk
  • 等放入循环中。

由于您的样本维度值始终显示在
x定界符之前的数字较大,并且没有明显的瘦或脂肪比率,因此每个集合上的关键保留自然排序都可以解决问题。 demo array_walk( $resolutions, function (&$row) { asort($row, SORT_NATURAL); } ); var_export($resolutions);
如果您的项目具有更多的鼠标尺寸值,则应将迭代的计算最小化。 demo


0
投票
array_walk( $resolutions, function (&$row) { array_multisort( array_map( fn($v) => array_product(sscanf($v, '%dx%d')), $row ), $row ); } ); var_export($resolutions);

	
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.