【问题标题】:How to sort multidimensional array in PHP如何在 PHP 中对多维数组进行排序
【发布时间】:2020-06-20 15:44:25
【问题描述】:

我已经尝试了几乎所有在线建议,我真的不知道如何对这个 SESSION 数组进行排序。 我希望它按“itemname”排序..

我有并且想要这个输出,但是我需要 itemname 来确定哪个 item 数组首先出现。

Array
(
[person] => Array
    (
        [namex] => Array
            (
                [itema] => Array
                    (
                        [itemid] => 43
                        [itemname] => def
                    )

                [itemc] => Array
                    (
                        [itemid] => 33
                        [itemname] => abc
                    )

                [itemg] => Array
                    (
                        [itemid] => 29
                        [itemname] => ghi
                    )

            )

        [namey] => Array
            (
                [itemj] => Array
                    (
                        [itemid] => 12
                        [itemname] => abc
                    )

                [iteme] => Array
                    (
                        [itemid] => 44
                        [itemname] => jkl
                    )

                [itemr] => Array
                    (
                        [itemid] => 20
                        [itemname] => rst
                    )

            )

    )

)

因此,“人”保持不变,但名称、物品、itemid 和 itemname 始终不同。

谁能帮我按项目名称排序? 我需要数组是这样的,所以不能改变它。

另外.. 我需要稍后在 foreach 中访问它,以便打印出这些项目。

【问题讨论】:

  • 我试过了.. 不能让它工作:(
  • 输出应该是什么样的确切?询问是因为目前尚不清楚在对分布在多个名称条目的“itemname”列进行排序时应如何处理名称层。请给出预期输出数组的布局。您的问题下方有一个“编辑”链接。 用它修改你的问题。
  • 我不太明白你的问题。我希望能够获得 itemc[itemid] 并且与 itemname 相同。我快要放弃了,我正在尝试实施代码建议,但没有任何效果。
  • 当我回显每个项目时,我需要对结果进行排序。而且我需要从 itemname 开始的顺序是 a-z,无论它的名称是什么。

标签: php arrays sorting multidimensional-array


【解决方案1】:

正如 cmets 对问题所指出的那样,所需的输出并未真正定义。您必须给出输出的具体定义,否则我们必须假设可能正在寻找什么:

<?php
$data = [
  "person" => [
    "namex" => [
      "itema" => [
        "itemid" => 43,
        "itemname" => "def"
      ],
      "itemc" => [
        "itemid" => 33,
        "itemname" => "abc"
      ],
      "itemg" => [
        "itemid" => 29,
        "itemname" => "ghi"
      ]
    ],
    "namey" => [
      "itemj" => [
        "itemid" => 12,
        "itemname" => "abc"
      ],
      "iteme" => [
        "itemid" => 44,
        "itemname" => "jkl"
      ],
      "itemr" => [
        "itemid" => 20,
        "itemname" => "rst"
      ]
    ]
  ]
];
foreach ($data["person"] as $personName => &$person) {
  uasort($person, function($a, $b) {
    return $a["itemname"] > $b["itemname"];
  });
}
print_r($data);

明显的输出是:

Array
(
    [person] => Array
        (
            [namex] => Array
                (
                    [itemc] => Array
                        (
                            [itemid] => 33
                            [itemname] => abc
                        )
                    [itema] => Array
                        (
                            [itemid] => 43
                            [itemname] => def
                        )
                    [itemg] => Array
                        (
                            [itemid] => 29
                            [itemname] => ghi
                        )
                )
            [namey] => Array
                (
                    [itemj] => Array
                        (
                            [itemid] => 12
                            [itemname] => abc
                        )
                    [iteme] => Array
                        (
                            [itemid] => 44
                            [itemname] => jkl
                        )
                    [itemr] => Array
                        (
                            [itemid] => 20
                            [itemname] => rst
                        )
                )
        )
)

【讨论】:

    【解决方案2】:

    假设示例中的输入通过数组表示为:

    <?php
    $array = [
        'person' => [
            'namex' => [
                'itema' => [
                    'itemid' => 43,
                    'itemname' => 'def'
                ],
                'itemb' => [
                    'itemid' => 33,
                    'itemname' => 'abc'
                ],
                'itemc' => [
                    'itemid' => 29,
                    'itemname' => 'ghi'
                ],
            ],
            'namey' => [
                'itema' => [
                    'itemid' => 12,
                    'itemname' => 'abc'
                ],
                'itemb' => [
                    'itemid' => 44,
                    'itemname' => 'jkl'
                ],
                'itemc' => [
                    'itemid' => 20,
                    'itemname' => 'rst'
                ],
            ],
        ]
    ];
    
    
    

    你可以在循环中使用array_multisort

    $ids = [];
    foreach($array as $key => $value) {
        foreach ($value as $newKey => $value2) {
            $ids[$newKey] = array_column($value2, 'itemname');
            array_multisort($ids[$newKey], SORT_NATURAL, $array[$key][$newKey]);
        }
    }
    
    

    这将输出

    array(1) {
      'person' =>
      array(2) {
        'namex' =>
        array(3) {
          'itemb' =>
          array(2) {
            'itemid' =>
            int(33)
            'itemname' =>
            string(3) "abc"
          }
          'itema' =>
          array(2) {
            'itemid' =>
            int(43)
            'itemname' =>
            string(3) "def"
          }
          'itemc' =>
          array(2) {
            'itemid' =>
            int(29)
            'itemname' =>
            string(3) "ghi"
          }
        }
        'namey' =>
        array(3) {
          'itema' =>
          array(2) {
            'itemid' =>
            int(12)
            'itemname' =>
            string(3) "abc"
          }
          'itemb' =>
          array(2) {
            'itemid' =>
            int(44)
            'itemname' =>
            string(3) "jkl"
          }
          'itemc' =>
          array(2) {
            'itemid' =>
            int(20)
            'itemname' =>
            string(3) "rst"
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      相关资源
      最近更新 更多