Как отсортировать многомерный массив в PHP - PullRequest
0 голосов
/ 20 июня 2020

Я перепробовал почти все предложения в Интернете и действительно не могу понять, как отсортировать этот массив SESSION. Я хочу, чтобы он был отсортирован по "имени элемента" ..

У меня есть и хочу этот результат, но мне нужно имя элемента, чтобы определить, какой массив элементов появится первым.

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
                    )

            )

    )

)

Итак, «человек» остается прежним, но имя, элемент, идентификатор элемента и имя элемента всегда разные.

Может ли кто-нибудь помочь мне отсортировать это по имени элемента? Мне нужно, чтобы массив был таким, поэтому я не могу его изменить.

Также ... Мне нужно получить к нему доступ позже в foreach, чтобы я мог распечатать элементы.

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Предполагая, что входные данные из примера представлены в виде массива как:

<?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 в al oop:

$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"
      }
    }
  }
}
0 голосов
/ 20 июня 2020

Как указано в комментариях к вопросу, желаемый результат на самом деле не определен. Вам нужно будет указать конкретное c определение вывода, без этого мы должны предположить то, что вы вероятно ищете:

<?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
                        )
                )
        )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...