簡體   English   中英

在PHP中排序多維關聯數組

[英]Sorting multi-dimensional associative array in PHP

我有一個看起來像這樣的PHP數組:

array (size=1)
  'Marriot' => 
    array (size=7)
      0 => string 'doc5.txt' (length=8)
      1 => string 'test.txt' (length=8)
      2 => string 'test1.txt' (length=9)
      3 => string 'test2.txt' (length=9)
      4 => string 'test3.txt' (length=9)
      5 => 
        array (size=1)
          'Special Docs' => 
            array (size=2)
              0 => string 'doc4.txt' (length=8)
              1 => string 'doc3.txt' (length=8)
      6 => 
        array (size=1)
          'ADocs' => 
            array (size=0)
              empty

如您所見,它包含非關聯文件,然后包含兩個文件夾“ Special Docs”和“ ADocs”。 我的問題有兩個:

首先,我想將兩個文件夾移到陣列的頂部,以便它們在我的視圖中突出顯示。 其次,我想按字母順序對文件夾進行排序(即,將“ ADocs”放在“ Special Docs”上方。我嘗試了array_multisort失敗,並且有點卡在這里。有人知道我將如何實現這一目標嗎?

謝謝你的幫助。

輸入示例

$dir = array(
    0 => 'doc5.txt',
    1 => 'test.txt',
    2 => 'test1.txt',
    3 => 'test2.txt',
    4 => 'test3.txt',
    5 => array(
        'Special Docs' => array (
              0 => 'doc4.txt',
              1 => 'doc3.txt'
          )
    ),
    6 => array( 
        'ADocs' => array()
    )
);

1級排序

function cmp ($a,$b) {
    if (is_array($a)){
        if (is_array ($b)) {
            return strnatcasecmp (key($a), key($b));
        } else {
            return -1;
        }
    } else {
        if (is_array ($b)) {
            return 1;
        } else {
            return strnatcasecmp ($a, $b);
        }
    }
}

示例輸出

Array
(
    [0] => Array
        (
            [ADocs] => Array
                (
                )

        )

    [1] => Array
        (
            [Special Docs] => Array
                (
                    [0] => doc4.txt
                    [1] => doc3.txt
                )

        )

    [2] => doc5.txt
    [3] => test.txt
    [4] => test1.txt
    [5] => test2.txt
    [6] => test3.txt
)

多級排序(無限)

function cmp (&$a,&$b) {
    if (is_array($a)){
        usort($a[key($a)], 'cmp');
        if (is_array ($b)) {
            return strnatcasecmp (key($a), key($b));
        } else {
            return -1;
        }
    } else {
        if (is_array ($b)) {
            return 1;
        } else {
            return strnatcasecmp ($a, $b);
        }
    }
}

usort ($dir, 'cmp');

示例輸出

Array
(
    [0] => Array
        (
            [ADocs] => Array
                (
                )

        )

    [1] => Array
        (
            [Special Docs] => Array
                (
                    [0] => doc3.txt
                    [1] => doc4.txt
                )

        )

    [2] => doc5.txt
    [3] => test.txt
    [4] => test1.txt
    [5] => test2.txt
    [6] => test3.txt
)

暫無
暫無

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

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