0

私は配列を持っています:

$arr = array(

    'Alcatel' => '0',
    'Apple' =>   '4542',
    'LG' =>      '0',
    'Nokia' =>   '0',
    'Samsung' => '2760',
    'Siemens' => '0',
    'Sony' =>    '0',

);

すべてのキーはアルファベット順に並べられていますが、値はそうではありません。1-関連付けを維持する2-配列をHIGHからLOWの値で並べ替える3-値がゼロのエントリのアルファベット順を維持する

取得するため:

$arr = array(

    'Apple' =>   '4542',
    'Samsung' => '2760',
    'Alcatel' => '0',
    'LG' =>      '0',
    'Nokia' =>   '0',
    'Siemens' => '0',
    'Sony' =>    '0',

);

arsort($ arr);を使用したとき

私が得た:

$arr = array(
  'Apple' =>   '4542',
  'Samsung' => '2760',
  'Siemens' => '0',
  'Sony' =>    '0',
  'Nokia' =>   '0',
  'LG' =>      '0',
  'Alcatel' => '0',
);

だから私は3ではなく1と2の目標を達成しました

なにか提案を?

ありがとう。

4

2 に答える 2

0

より一般的なケースでは、個別のソース配列にキーと値がまだ用意されていない場合は、カスタム比較関数が必要になります。比較関数にキーを渡すバージョンsortと、値を渡すバージョンがありますが、両方が必要であり、両方を渡すバージョンはありません。

キーを渡すのでuksort、値を検索できますが、比較関数から並べ替えられている配列にアクセスすると、信頼できない結果とPHPからの警告が表示されます。したがって、コピーを作成する必要があります。

私が考えることができる最もクリーンな解決策は、コピー/アクセスをクロージャーでラップすることでした(したがって、これには5.4が必要です)。

$arr = array(
    'Alcatel' => '0',
    'Apple' =>   '4542',
    'LG' =>      '0',
    'Nokia' =>   '0',
    'Samsung' => '2760',
    'Siemens' => '0',
    'Sony' =>    '0',
  );

  function mkcmp($arr) {
    return function($k1, $k2) use ($arr) {
      $v1 = $arr[$k1];
      $v2 = $arr[$k2];

      if ($v1 > $v2) {
        return -1;
      } else if ($v1 < $v2) {
        return 1;
      } else if ($k1 < $k2) {
        return -1;
      } else if ($k1 == $k2) {
        return 0;
      } else {
        return 1;
      }
    };
  }

  uksort($arr, mkcmp($arr));

そしてprint_r($arr)、ソート後の出力は次のとおりです。

Array
(
    [Apple] => 4542
    [Samsung] => 2760
    [Alcatel] => 0
    [LG] => 0
    [Nokia] => 0
    [Siemens] => 0
    [Sony] => 0
)
于 2012-11-09T14:29:48.870 に答える
0

わかりました、私はついにやった:

$arr は 2 つの配列 $titles と $values の組み合わせであるため:

array_multisort($values, SORT_DESC, $titles, SORT_ASC, $arr);

これは最終的に機能します!

于 2012-11-08T22:58:33.783 に答える