PHP“警告:usort()[function.usort]:比較関数が無効です”並べ替えについて

StackOverflow https://stackoverflow.com/questions/1229324

質問

iには連想配列として次のデータがあります

array
  'abc' => 
    array
      'label' => string 'abc' (length=3)
      'weight' => float 3
  'wsx' => 
    array
      'label' => string 'wsx' (length=3)
      'weight' => float 1
  'qay' => 
    array
      'label' => string 'qay' (length=3)
      'weight' => float 1
  'http://test.com' => 
    array
      'label' => string 'http://test.com' (length=15)
      'weight' => float 0
  'Nasi1' => 
    array
      'label' => string 'Nasi1' (length=5)
      'weight' => float 0
  'fax' => 
    array
      'label' => string 'fax' (length=3)
      'weight' => float 4

" label"を使用して配列をソートしたいまたは" weight"

ラベルの比較関数は次のとおりです。

function compare_label($a, $b)
{
    return strnatcmp($a['label'], $b['label']);
}

そして私が別の関数から関数を呼び出すよりも:

usort($label, 'compare_label');
var_dump($label);

しかし、エラーメッセージが表示され、配列はソートされません。何が間違っているのか分かりません。置き換えようとしました:

  • usort($ label、 'compare_label'); usort($ label、compare_label);
  • usort($ label、 'compare_label'); usort($ label、$ this-> compare_label);

成功せず。誰かが私にヒントをくれますか?

役に立ちましたか?

解決

compare_label がメンバー関数(つまり、クラスメソッド)の場合、別の方法で渡す必要があります。

usort( $label, array( $this, 'compare_label' ) );

基本的には、関数名の文字列を送信する代わりに、2要素の配列を送信します。最初の要素はコンテキスト(メソッドが見つかるオブジェクト)で、2番目の要素は関数名。

注:メソッドが静的な場合、クラスの名前を配列の最初の要素として渡します

usort( $label, array( __CLASS__, 'compare_label' ) );

他のヒント

比較関数は、グローバル関数またはオブジェクトのメソッドとして定義されていますか?メソッドの場合、呼び出し方法をわずかに変更する必要があります。

usort($label, array($object, "compare_label")); 

クラス自体の静的メソッドとして宣言することもできます:

public static function compare_label ($a, $b) {
   [...]
}

usort($label, array(Class_Name, "compare_label"));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top