1

PHPで連想配列を人間用にソート(自然ソート)する方法は?

次のコード:

<?php

$notSorted = array( 
array( 'Title' => 'rose', 
'Price' => 1.25,
'Number' => '10' 
),
array( 'Title' => 'daisy', 
'Price' => 0.75,
'Number' => '1',
),
array( 'Title' => 'orchid', 
'Price' => 1.15,
'Number' => '7' 
)
);

//ここでソートが行われるに違いない

foreach ( $notSorted as $val )
  echo $val['Number'], " - ";

?>

出力しようとしています: 10 - 1 - 7

そして、「番号」をソートする方法(人間用)? お気に入り: 1 - 7 - 10

また、'Number' が int で文字列の場合はどうなるでしょうか?

4

4 に答える 4

0

Numberフィールドが整数 (または浮動小数点数) の場合は、フィールドarray_multisortでソートすることを使用して指定するだけですNumberhttp://php.net/manual/en/function.array-multisort.phpドキュメントの例 #3 は、連想配列に対してこれを行う方法を示しています。

が文字列の場合、事態はさらに難しくなりNumberます。その場合、「7」が「10」の前に来るように、「自然な」ソートを行う必要があります。PHP 5.4 以降を使用array_multisortしている場合は、SORT_NATURALフラグを使用できます。PHP 5.4 よりも古いものを使用している場合は、おそらく and を使用する必要がusortありstrnatcmpます。その方法の詳細については、 https://stackoverflow.com/a/11315019/26311を参照してください。

于 2013-03-28T15:46:27.633 に答える
0

フィールド「Number」は文字列であるため、文字ごとに比較され、数千ごとではなく、数百ごとに比較されます。

独自の並べ替え関数を作成して、 と一緒に使用したりusortsortと一緒に使用したりできます。SORT_NUMERICarray_multi_sort

于 2013-03-24T15:05:08.733 に答える
0

この方法で試すことができます:

<?php

function record_sort($records, $field, $reverse=false)
 {
     $hash = array();

    foreach($records as $record)
     {
         $hash[$record[$field]] = $record;
     }

    ($reverse)? krsort($hash) : ksort($hash);

    $records = array();

    foreach($hash as $record)
     {
         $records []= $record;
     }

    return $records;
 }

// Example below

$airports = array
 (
     array( "code" => "LHR", "name" => "Heathrow" ),
     array( "code" => "LGW", "name" => "Gatwick" ),
 );

printf("Before: <pre>%s</pre>", print_r($airports, true));

$airports = record_sort($airports, "name");

printf("After: <pre>%s</pre>", print_r($airports, true));

?>

Example Outputs:

Before: Array
 (
     [0] => Array ( [code] => LHR, [name] => Heathrow )
     [1] => Array ( [code] => LGW, [name] => Gatwick )
 )

After: Array
 (
     [0] => Array ( [code] => LGW, [name] => Gatwick )
     [1] => Array ( [code] => LHR, [name] => Heathrow )
 ) 

http://php.net/manual/en/function.asort.phpから

于 2013-03-24T15:08:28.567 に答える