2017-07-26 115 views
0

我想重新安排下面的數組,其中字母鍵應該先來,然後數字鍵。 其實陣列如下。陣列重新排序基於php中的密鑰

Array 
(
[1] => completed 
[2] => completed 
[3] => completed 
[4] => completed 
[5] => 
[user_name] => ABCD 
) 

和輸出應該看起來

Array 
(
[user_name] => ABCD 
[1] => completed 
[2] => completed 
[3] => completed 
[4] => completed 
[5] => 
) 

在此先感謝。

+2

想知道「爲什麼」這裏......您可以按名稱通過關聯數組重點解決的一個陣列中的任何元素,或位置通過數字鍵。我不知道有什麼好的設計模式需要重新排列陣列。也許如果你能更多地告訴我們這個問題,我們可以提供一個更好的建議。 –

+2

['uksort()'](http://php.net/manual/en/function.uksort.php)是你正在尋找的功能。 – axiac

回答

-3

這個測試好了,我想。 https://iconoun.com/demo/temp_chiru.php

手冊頁參考:http://php.net/manual/en/array.sorting.php

建議您嘗試鏈接你downvote這個或發送筆者就白費力氣寫用戶代碼做的是已經內置到PHP之前!

<?php // demo/temp_chiru.php 
 
/** 
 
* User-Sorting an array 
 
* 
 
* https://stackoverflow.com/questions/45332372/array-reordering-based-on-key-in-php 
 
* http://php.net/manual/en/function.ksort.php 
 
*/ 
 
error_reporting(E_ALL); 
 
echo '<pre>'; 
 

 

 
$arr = Array 
 
('1' => 'completed' 
 
, '2' => 'completed' 
 
, '3' => 'completed' 
 
, '4' => 'completed' 
 
, '5' => NULL 
 
, 'user_name' => 'ABCD' 
 
) 
 
; 
 

 
ksort($arr); 
 
var_dump($arr); 
 

 

 
$arr = Array 
 
(1 => 'completed' 
 
, 2 => 'completed' 
 
, 3 => 'completed' 
 
, 4 => 'completed' 
 
, 5 => NULL 
 
, 'user_name' => 'ABCD' 
 
) 
 
; 
 

 
ksort($arr); 
 
var_dump($arr);

+1

'ksort()'僅在意外情況下返回所需的結果。它將字符串與數字進行比較,字符串評估爲'0','ksort()'決定它們比數字「小」。如果'0'是數組中的一個鍵,則中斷。更重要的是,你的代碼在PHP 5和PHP 7中產生了不同的結果。看看這裏:https://3v4l.org/qRBMV – axiac

+0

我測試零作爲數組鍵,它工作正常。此外,我找不到任何手冊頁,表明鍵是嚴格鍵入的,測試表明相反。 http://php.net/manual/en/language.types.array.php –

+0

由於我之前的例子並沒有說服你我會爲你提供一個更好的:https://3v4l.org/kI2WI – axiac

2

您需要自定義排序,如:

uksort($a, function($a, $b){ 

    if ((is_numeric($a) && ! is_numeric($b))) { 
     return 1; 
    } 

    if (!is_numeric($a) && is_numeric($b)) { 
     return -1; 
    } 

    return $a > $b ? 1 : ($a == $b ? 0 : -1); 

}); 
+1

第二個返回語句應該是-1,而不是0 –

+0

沒有必要寫一個uksort()算法。內置的PHP函數完全符合作者的需求。數組鍵不受嚴格的比較。試試看例子。 –

+0

根據我的測試,第二個return語句看起來是正確的。 –

0

你需要的功能是uksort()。它通過鍵對數組排序,維護鍵值關聯並允許您編寫排序規則。

這可能是這樣的:

$data = [ 
    1 => 'completed', 
    2 => 'Completed', 
    3 => 'completed', 
    4 => 'completed', 
    5 => NULL, 
    'user_name' => 'KABCD', 
]; 

uksort(
    $data, 
    function ($a, $b) { 
     if (is_string($a)) { 
      return is_string($b) ? strcmp($a, $b) : -1; 
     } else { 
      return is_string($b) ? +1 : ($a - $b); 
     } 
    } 
); 

回調函數總是返回「字符串<整數」時的類型通過按鍵不同,它採用適當的比較方法時,它們是相同的。

在PHP 7的功能可以使用新comparison operator這樣寫:

function ($a, $b) { 
     if (is_string($a)) { 
      return is_string($b) ? ($a <=> $b) : -1; 
     } else { 
      return is_string($b) ? +1 : ($a <=> $b); 
     } 
    }