【问题标题】:How to move a subarray column to the first position of all subarrays?如何将子数组列移动到所有子数组的第一个位置?
【发布时间】:2018-07-17 04:28:25
【问题描述】:

我有一个数组数组:

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”排序吗?

【问题讨论】:

  • 重新阅读您的问题后,您的需求可以用不同的方式来解释。您的子数组已经根据列 b 的值进行了 ASC 排序,因此看起来这不是您需要的。从您想要的输出中,您似乎只想将 b 列移动到第一个位置。如果这不是您想要的,请编辑/澄清您的问题。

标签: php arrays sorting multidimensional-array


【解决方案1】:

当然可以,您只需为其编写自己的比较函数,并将其与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 确实可以解决问题。

【讨论】:

    【解决方案2】:

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

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

    只需迭代每个子数组,生成一个包含要移到前面的列的单元素数组,然后使用联合运算符 (+) 将完整的子数组添加到其中。这将悄悄地用其原始值覆盖b,但将其置于所有其他元素之前。

    代码:(Demo)

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

    输出:

    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',
      ),
    )
    

    这个结果可以通过多种方式产生——这只是一种。

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

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

    我的 sn-p 中的相同技术可用于将多列带到子数组的前面;只需在联合运算符之前指定生成子数组中的顺序即可。

    如果您希望将所有列移动到不同的位置,或者如果您的子数组中有数字键,请不要使用联合运算符;按所需顺序返回完整的子数组(换句话说,使用变量完全重写子数组,就像我对 'key' => $variable['key'] 所做的那样。

    【讨论】:

      猜你喜欢
      • 2018-10-15
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2022-11-14
      • 2023-03-29
      • 1970-01-01
      • 2019-06-17
      • 2014-04-12
      相关资源
      最近更新 更多