0

これに関して他にもいくつかの質問があることは承知していますが、それらは私には意味をなさないか、必要に応じて機能しません。

と を使用してアルファベット順に最初の値で簡単にソートできる配列がasort()ありarsort()ます。私の多次元配列の例は次のとおりです。

[{"Name":"Amber","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Bob","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Hans","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Jeff","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Michael","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0}]

使用するasort()と、アルファベット順または逆アルファベット順arsort()でソートされます。"Name"今、私は同じ機能を必要としてい"dealType"ます.

Stackoverflow に既に投稿されているいくつかの例を試してみましたが、機能していないため、誤解しているに違いありません。どうすればこれを達成できますか?

編集 ジョナサンは、アルファベット順の並べ替えに正しい答えを与えましたが、わずかに変更されています。

//the custom function to do our sort
function cmp($a,$b){
    //get which string is less or 0 if both are the same
    $cmp = strcasecmp($a->dealType, $b->dealType);
    //if the strings are the same, check name
    return $cmp;
}
//sort using a custom function
usort($obj, 'cmp');

そして、逆アルファベット順ソートのための以下のコード:

//the custom function to do our sort
function cmp($a,$b){
    //get which string is less or 0 if both are the same
    $cmp = strcasecmp($b->dealType, $a->dealType);
    //if the strings are the same, check name
    return $cmp;
}
//sort using a custom function
usort($obj, 'cmp');
4

3 に答える 3

2

カスタム比較関数を使用して、並べ替え時に最初に来る値を決定できるusortを使用する必要があります。

何かのようなもの:

<?php
//the data you supplied. normally just an array
$data = array ( 0 => array ( 'Name' => 'Amber', 'date' => '', 'dealType' => 'deal1', 'id' => '***@***.com', 'registered' => 0, ), 1 => array ( 'Name' => 'Bob', 'date' => '', 'dealType' => 'deal5', 'id' => '***@***.com', 'registered' => 0, ), 2 => array ( 'Name' => 'Hans', 'date' => '', 'dealType' => 'deal3', 'id' => '***@***.com', 'registered' => 0, ), 3 => array ( 'Name' => 'Jeff', 'date' => '', 'dealType' => 'deal2', 'id' => '***@***.com', 'registered' => 0, ), 4 => array ( 'Name' => 'Michael', 'date' => '', 'dealType' => 'deal1', 'id' => '***@***.com', 'registered' => 0, ), );

//show what we got going into sort
echo '<pre>'.print_r($data, 1).'</pre>';

function cmp($a,$b){
    //get which string is less or 0 if both are the same
    $cmp = strcasecmp($a['dealType'], $b['dealType']);
    //if the strings are the same, check name
    if($cmp == 0){
        //compare the name
        $cmp = strcasecmp($a['Name'], $b['Name']);
    }
    return $cmp;
}
//sort using a custom function
usort($data, 'cmp');

//show what we got after sort
echo '<pre>'.print_r($data, 1).'</pre>';
?>

dealTypeそれは最初にソートされ、同じName場合は 2 番目にソートされます。dealType逆にソートしたい場合は、呼び出しで$aとの順序を入れ替えることができます。$bstrcasecmp()

編集: このデータはデータベースから取得されている可能性があります。もしそうならORDER BY、列だけです。あなたは好きにすることができますSELECT * FROM table ORDER BY dealType ASC,Name ASC

Edit2: 匿名関数を使用しないようにコードを更新しました。また、 ideoneで動作するコードを表示することもできます

于 2012-04-19T20:35:55.953 に答える
1

私があなたの問題を正しく理解しているなら、あなたは配列(例えばA)の配列(例えばB)を持っていて、それらの中にある値でBをソートしたいと思っています。そうだとすれば、私は以前に同じ問題を抱えていて、line_sortというカスタム関数を作成しました。必要に応じて、次の例で使用できます。

$array=json_decode('[{"Name":"Amber","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Bob","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Hans","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Jeff","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0},{"Name":"Michael","date":"","dealType":"B-Braun Medical, Inc.","id":"***@***.com","registered":0}]');
$array=line_sort("dealType",$array);

最初の値は並べ替えるキー、2番目の値は並べ替える配列です。これが関数コードです(英語ではありません)。

function line_sort($klic,$hodnoty)
{
  if (!is_array($hodnoty))
  {
    trigger_error("Second parameter has to be multidimensional array", E_USER_WARNING );
    return;
  }
  for ($x=0;$x<count($hodnoty)-1;$x++)
  {
    for ($y=count($hodnoty)-1;$y>=$x;$y--)
    {
      $radek1=$hodnoty[$y];
      $radek2=$hodnoty[$y+1];
      if ((isset($radek1[$klic]) && isset($radek2[$klic])) && (intval($radek1[$klic]) > intval($radek2[$klic])) || (isset($radek2[$klic]) && !isset($radek1[$klic])))
      {
        $hodnoty[$y]=$radek2;
        $hodnoty[$y+1]=$radek1;
        continue;
      }
      else if((isset($radek1[$klic]) && isset($radek2[$klic])) && (intval($radek1[$klic]) == intval($radek2[$klic])))
      {
        if (strcmp($radek1[$klic],$radek2[$klic])>0)
        {
          $hodnoty[$y]=$radek2;
          $hodnoty[$y+1]=$radek1;
        }
      }
    }
  }
  return $hodnoty;
}

この関数の出力例を確認したい場合は、http://test.hanzlsoft.eu/を確認してください。

于 2012-04-19T20:52:48.153 に答える
0

私はあなたが探していると信じていますarray_multisort(): http://php.net/manual/en/function.array-multisort.php

例:

<?php
$ar = array(
       array("10", 11, 100, 100, "a"),
       array(   1,  2, "2",   3,   1)
      );
array_multisort($ar[0], SORT_ASC, SORT_STRING,
                $ar[1], SORT_NUMERIC, SORT_DESC);
var_dump($ar);
?>

ソース: http://php.net/manual/en/function.array-multisort.php#example-4558

于 2012-04-19T20:34:37.410 に答える