簡體   English   中英

在多維數組上使用 UASORT 的 PHP 遞歸循環

[英]PHP Recursive Loop using UASORT on Multidimensional Array

我正在編寫一個循環遍歷多維數組的腳本,它按預期工作(有點),但我遇到了無法補救的錯誤。

我仍然不太習慣構建循環來管理嵌套數組。

這是我的代碼。 目標是按序列鍵的值對每一層進行排序,最后我將數組導出為 json。

序列鍵可能存在也可能不存在於每個子數組中,因此可能需要某種if 子句

<?php
$list = [
        "key" => "book",
        "sequence" => 1,
        "items" => [
            [
                "key" => "verse",
                "sequence" => 2,
                "items" => [
                    ["sequence" => 3],
                    ["sequence" => 1],
                    ["sequence" => 2],
                ],
            ],
            [
                "key" => "page",
                "sequence" => 1,
                "items" => [
                    [
                        "key" => "page",
                        "sequence" => 2,
                        "items" => [
                            ["sequence" => 2],
                            ["sequence" => 1],
                            ["sequence" => 3],
                        ],
                    ],
                    [
                        "key" => "paragraph",
                        "sequence" => 1,
                        "items" => [
                            ["sequence" => 2],
                            ["sequence" => 1],
                            ["sequence" => 3],
                        ],
                    ],
                ],
            ],
        ],
    ];

function sortit(&$array){

    foreach($array as $key => &$value){
        //If $value is an array.
        if(is_array($value)){

            if($key == "items"){
                uasort($value, function($a,&$b) {
                   return $a["sequence"] <=> $b["sequence"];
                });

            }
            //We need to loop through it.
            sortit($value);
        } else{
            //It is not an array, so print it out.
            echo $key . " : " . $value . "<br/>";
        }
    }
}


sortit($list);

echo "<pre>";

print_r($list);

?>

這是我得到的輸出和錯誤,我想我明白為什么會拋出錯誤,但同時我無法實施修復錯誤所需的正確檢查。

key : book
sequence : 1
key : page
sequence : 1

E_WARNING : type 2 -- Illegal string offset 'sequence' -- at line 39

E_NOTICE : type 8 -- Undefined index: sequence -- at line 39
sequence : 1
sequence : 2
sequence : 3
sequence : 1
key : page

E_WARNING : type 2 -- Illegal string offset 'sequence' -- at line 39

E_NOTICE : type 8 -- Undefined index: sequence -- at line 39
sequence : 1
sequence : 2
sequence : 3
sequence : 2
key : verse

並不是說我很擔心,但我想要的另一件事是數組仍按原始順序構建,即: key, sequence, items

使用usort和數組引用使其變得簡單。 如果我們正在處理具有設置item鍵的數組,則對item數組進行排序並對其子item遞歸,否則,我們處於葉節點並且可以返回。

function seqSort(&$arr) {
    if (is_array($arr) && array_key_exists("items", $arr)) {
        usort($arr["items"], function ($a, $b) {
            return $a["sequence"] - $b["sequence"];
        });

        foreach ($arr["items"] as &$item) {
            $item = seqSort($item);
        }
    }

    return $arr;
}

結果:

array (
  'key' => 'book',
  'sequence' => 1,
  'items' => 
  array (
    0 => 
    array (
      'key' => 'page',
      'sequence' => 1,
      'items' => 
      array (
        0 => 
        array (
          'key' => 'page',
          'sequence' => 1,
          'items' => 
          array (
            0 => 
            array (
              'sequence' => 1,
            ),
            1 => 
            array (
              'sequence' => 2,
            ),
            2 => 
            array (
              'sequence' => 3,
            ),
          ),
        ),
      ),
    ),
    1 => 
    array (
      'key' => 'verse',
      'sequence' => 2,
      'items' => 
      array (
        0 => 
        array (
          'sequence' => 1,
        ),
        1 => 
        array (
          'sequence' => 2,
        ),
        2 => 
        array (
          'sequence' => 3,
        ),
      ),
    ),
  ),
)

嘗試一下!

請注意,最外層結構是一個根節點,它不屬於數組且無法排序(這可能是無意的並導致混淆)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM