2017-07-26 9 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

このテストはOKです。 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

2番目のreturn文は0ではなく-1にする必要があります。 –

+0

uksort()アルゴリズムを書く必要はありません。組み込みのPHP関数は、著者が必要とするものとまったく同じです。配列キーは厳密な比較の対象にはなりません。例を試してみてください。 –

+0

私のテストでは、2番目の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); 
     } 
    } 
関連する問題