按自定义顺序对php数组列进行排序

时间:2018-02-07 01:01:30

标签: php arrays sorting multidimensional-array

我有一个数组数组:

Array ( 
[0] => Array (
    [a] = 1,
    [b] = 'ABC',
    [c] = 'ABC',
[1] => Array (
    [a] = 2,
    [b] = 'DEF',
    [c] = 'DEF',
[2] => Array (
    [a] = 3,
    [b] = 'JKL',
    [c] = 'JKL',

我怎么能让我的阵列变成这样:

Array ( 
[0] => Array (
    [b] = 'ABC',
    [a] = 1,
    [c] = 'ABC',
[1] => Array (
    [b] = 'DEF',
    [a] = 2,
    [c] = 'DEF',
[2] => Array (
    [b] = 'JKL',
    [a] = 3,
    [c] = 'JKL',

我可以用字符串值“b”然后“a”然后“c”对它进行排序吗?

2 个答案:

答案 0 :(得分:0)

当然可以,你只需要为它编写自己的比较函数,并将其与uksort结合起来。在你的情况下,你可以使用这样的函数($input是你的输入数组,$output结果是ldo):

$output = array_map(uksort($input, function ($a, $b) {
  if ($a === 'b') return -1;
  if ($a === 'c') return 1;
  if ($b === 'b') return 1;
  return -1;
}

您可能想要重写该功能,但array_mapuksort的组合应该可以帮助您入门。或者不要;)因为键是唯一的,所以四个if实际上就是诀窍。

答案 1 :(得分:0)

您的任务可以改写为“如何将元素移动到子数组的第一个位置?”

这可以在不进行任何迭代函数调用或比较的情况下实现。

只需迭代每个子数组,生成一个包含要移到最前面的列的单元素数组,然后使用并运算符(boolean isFinished = false Thread { this.repository = Repository.getInstance(); ClientLocation.LocationResult locationResult = new ClientLocation.LocationResult() { @Override public void gotLocation(Location location) { userLatitude = Double.toString(location.getLatitude()); userLongitude = Double.toString(location.getLongitude()); isFinished = true } }; while(true){ if(isFinished ) break: } ClientLocation clientLocation = new ClientLocation() clientLocation.getLocation(getApplication().getApplicationContext(), locationResult); deals = repository.getDeals(searchQuery, maxDistInKm, userLatitude, userLongitude); Thread.currentThread().interrupt() } )向其添加完整的子数组。这将用其原始值悄悄覆盖+,但将其放置在所有其他元素之前。

代码:(Demo

b

输出:

$array = [
    ['a' => 1, 'b' => 'ABC', 'c' => 'ABC'],
    ['a' => 2, 'b' => 'DEF', 'c' => 'DEF'],
    ['a' => 3, 'b' => 'JKL', 'c' => 'JKL']
];

var_export(
    array_map(function($subarray) {
        return ['b' => $subarray['b']] + $subarray;
    }, $array)
);

这种结果可以通过多种方式产生-这只是其中一种。

通常在显示关联数据时不需要此技术,但是我们看不到如何使用数据。

如果这些数据来自数据库,则最合理的技术是使用SQL排序。

我的代码片段中的相同技术可用于将多个列带到子数组的前面;只需在并运算符之前指定生成子数组中的顺序即可。

如果您希望将所有列移动到其他位置,或者子数组中有数字键,请不要使用并运算符;以所需的顺序返回完整的子数组(换句话说,就像我对array ( 0 => array ( 'b' => 'ABC', 'a' => 1, 'c' => 'ABC', ), 1 => array ( 'b' => 'DEF', 'a' => 2, 'c' => 'DEF', ), 2 => array ( 'b' => 'JKL', 'a' => 3, 'c' => 'JKL', ), ) 所做的那样,使用变量完全重写子数组。