2016-12-25 52 views
1

我想排序鍵名一個相當大的多維數組(不重視),但我也需要它是儘可能快的多維數組或生成的JSON。排序深受鍵名

生成的數組將被轉換爲JSON並保存在一個文件中,所以如果有辦法按鍵排序JSON,那就是我所需要的。

我有效地試圖找到PHP相當於蟒蛇的json.dumps(dict, sort_keys = True, indent = 4) < - 的sort_keys選項。


我試過uksort($array, 'strnatcasecmp');,但沒有在所有的工作,我也嘗試了一些其他的「定製」的解決方案,但沒有我想是足夠快和優雅。

此外,谷歌搜索「PHP深度排序多維數組按鍵/鍵名」結果什麼也沒有。每一個問題,根據關鍵在最後的標題排序需要按特定鍵的值排序...

有沒有什麼簡單快捷的方法來做到這一點?


這是這樣排列的一個簡單的例子

array(
    'common' => array(
     'zyu' => 'something', 
     'gka' => 'something', 
     'lfi' => 'something', 
     'abc' => 'something', 
    ), 
    'data_result' => array(
     'doc' => array(
      66145 => array(
       'lfk' => 'something', 
       'eks' => 'something', 
       'abc' => 'something' 
      ),    
      34154 => array(
       'lfk' => 'something', 
       'eks' => 'something', 
       'abc' => 'something' 
      ) 
     ), 
     'zus' => array(
      // some data 
     ), 
     'llo' => 'something', 
     'abc' => 'something' 
    ), 
    'data_1' => array(
     // Array with lots of values and another arrays inside 
    ), 
    'post' => array(
     'id' => 15525, 
     'time' => 156652363, 
     'something' => 'something' 
    ) 
); 

這是我需要得到(你可以看到,每一個數組的鍵按字母順序排序):

array(
    'common' => array(
     'abc' => 'something', 
     'gka' => 'something', 
     'lfi' => 'something', 
     'zyu' => 'something', 
    ), 
    'data_1' => array(
     // Array with lots of values and another arrays inside 
    ), 
    'data_result' => array(
     'abc' => 'something' 
     'doc' => array(
      34154 => array(
       'abc' => 'something' 
       'eks' => 'something', 
       'lfk' => 'something', 
      ) 
      66145 => array(
       'abc' => 'something' 
       'eks' => 'something', 
       'lfk' => 'something', 
      ),    
     ), 
     'llo' => 'something', 
     'zus' => array(
      // some data 
     ), 
    ), 
    'post' => array(
     'id' => 15525, 
     'something' => 'something' 
     'time' => 156652363, 
    ) 
); 

我試圖避免foreach循環和數組的重複,因爲數組非常大(生成的JSON文件有5500到7000行之間(有時甚至更多)),並且此操作將完成qui經常使用,我不想重載服務器,只是爲了讓JSON文件易於人類讀取和調試。


詩:我沒有創造這些陣列,其中大部分是由二進制文件,其中包含他們JSON格式的讀取。我只將它們組合到單個數組並對它們進行一些操作(添加一些自定義值等),然後將其另存爲JSON。

如果有什麼不清楚的地方(因爲這裏的3:35,我不在我的高峯期),發表評論,如有必要,我會編輯我的問題。

謝謝你的幫助。

回答

1

寫遞歸函數調用ksort每個數組項:

function ksort_recursive(array &$a) { 
    ksort($a, SORT_NATURAL | SORT_FLAG_CASE); 

    foreach ($a as $k => $v) { 
    if (is_array($v)) { 
     ksort_recursive($a[$k]); 
    } 
    } 
} 
+0

謝謝,但是這是我試圖避免的,因爲該功能的執行需要+ - 0.01秒(從我的測試中,通常在'0.009605884552秒')和國際海事組織,這是一個非常長的時間加上我不知道它有多大的CPU負荷。這是唯一可能/最快的方法嗎? – MiChAeLoKGB

+0

服務器端真的需要這個嗎?如果僅用於調試,則考慮在客戶端進行排序,即在JavaScript中進行排序。總有一種更好的方式,但我找不到它。 AFAIK,基本的快速排序算法是最好的。如果你真的需要在服務器端對數組進行排序,我可以給出的最好的建議是在C中實現上述函數(一個PHP擴展)。這將消除PHP函數調用開銷。啊,如果有很多空數組,檢查空虛將減少一些迭代:'if(is_array($ v)&& $ v){ksort_recursive($ a [$ k]); }'。 –

+0

可以使用'RecursiveArrayIterator'來實現它。它可能會節省一些記憶,但我懷疑它會更快。 –