【问题标题】:Usort sort multidimensional array by duplicate valuesUsort 按重复值对多维数组进行排序
【发布时间】:2018-02-01 09:25:46
【问题描述】:

我有一个数组

[0] => ['name' => John, city => NY, street => WallStreet ..some anouther fields]
[1] => ['name' => Bill, city => FI, street => smstr..  some anouther fields]
[2] => ['name' => John, city => NY, street => WallStreet  ..some anouther fields]
[3] => ['name' => Bill, city => FI, street => smstr ..some anouther fields]
[4] => ['name' => 4, city => 4, street => 4 ..some anouther fields]

我需要对其进行排序以使所有重复的名称城市和街道字段位于数组顶部或仅按顺序排列

我想要什么

[] => ['name' => John, city => NY, street => WallStreet..some anouther fields]
[] => ['name' => John, city => NY, street => WallStreet ..some anouther fields]
[] => ['name' => Bill, city => FI, street => smstr  ..some anouther fields]
[] => ['name' => Bill, city => FI, street => smstr ..some anouther fields]
[] => ['name' => 4, city => 4, street => 4 ..some anouther fields]

我正在尝试使用 usort

 usort($sorted, function($a, $b) {
            if ($a['name'] == $b['name'] &&
              $a['city'] == $b['city'] &&
              $a['street'] == $b['street']
            ){
                return 1;
            }
            else {
                return -1;
            }
        });

但它不适用于 php 5.3 ,有人可以提出解决方案吗?

p/s 我正在使用 php 5.3 :(

【问题讨论】:

  • 您想要的预期结果是什么?也将其粘贴到您的问题中
  • 什么定义了重复?它必须是 name AND city AND street 的副本,还是其中任何一个的副本? “在数组的顶部还是按顺序”是什么意思?
  • 请尝试包含一个稍微大一点的输入示例,以及您尝试获得的输出示例,并清楚地解释为什么应该是输出。
  • 附加输入和想要的输出是重复匹配仅当名称和城市和街道相同@Don'tPanic
  • 哇,真快!我不习惯那种对澄清请求的回应。

标签: php arrays multidimensional-array


【解决方案1】:

您可以映射到一个内爆值的数组,按降序排序并按该数组对原始数组进行排序:

array_multisort(array_map(function($v) {
                              return implode('-', $v);
                          }, $array), 
                SORT_DESC, $array);

分解并理解碎片:

// Build an array of the values in each sub array
// John-NY-WallStreet
$sorter = array_map(function($v) { return implode('-', $v); }, $array);
print_r($sorter);
// Sort that descending sorting the original array the same
array_multisort($sorter, SORT_DESC, $array);

这将适用于数组中的所有元素。如果出于某种原因您只想要namecitystreet,则将return 替换为:

return $v['name'].'-'.$v['city'].'-'.$v['street'];

【讨论】:

  • 哇,它的工作,我需要时间来了解你是怎么做到的)谢谢
  • 谢谢,补充一点说明
猜你喜欢
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 2023-03-31
  • 2011-05-29
相关资源
最近更新 更多