1

私は次のようなデータを持っています、

Bale # | Factory # | Design | Color    | Price   |
----------------------------------------------------------------
1      | PDX-1     | D1     | RED      | 10      |
1      | PDX-10    | D2     | BLUE     | 200     |
1      | PDX-2     | D3     | PINK     | Some int|
1      | PDX-3     | D1     | WHITE    | Some int|
2      | PDX-4     | D3     | APPLE    | Some int|
2      | PXX-56    | D3     | PINE     | Some int|
2      | XXX-1     | D1     | SILVER   | Some int|
1      | XXX-4     | D5     | BROWN    | Some int|
1      | DFX-1     | D5     | COFFEE   | Some int|
3      | ABC-1     | D6     | PURPLE   | Some int|
1      | ABC-2     | D6     | GOLD     | Some int|

これは多次元配列です。ここで、Bale#をキーに入れ、他の値をベールに対してサブ配列に入れます。

forloop (...)
      (.....)
    $sorted_by_bale[$BALE_NO][] = array(
        'jnb' => $factory_number,
        'design_name' => $order_design,
        'colorway' => $order_colorway,
        'usd_rate' => $price,
    );
}

値をベールで並べ替えてから、1つのベールの合計価格とベール内のアイテムの数を指定する必要があります。

ksort($sorted_by_bale);

Ksortはその目的を果たしました。

次に、ベール内でデザイン(最初)、次に色(2番目)で並べ替える必要があります。

4

3 に答える 3

1

使用する必要がありますusortドキュメントを参照)。これにより、独自のソート機能を使用できます。

1つの欠点は、配列キーがリセットされることです。しかし、これはセカンダリアレイには関係ないようです。

function sortBale($first, $second)
{
  if($first['design_name'] > $second['design_name']) {
    return 1;
  } elseif( $first['design_name'] < $second['design_name'] ) {
    return -1;
  } else {
    //they have the same design
    if($first['colorway'] > $second['colorway']) {
      return 1;
    } elseif( $first['colorway'] < $second['colorway'] ) {
      return -1;
    } else {
      return 0;
    }
  }
}
于 2012-11-28T14:32:52.477 に答える
1

カスタムソート関数を使用してusortする必要があります。

 //once your bale array is setup

 usort($sorted_by_bale, "compare_in_bale");



 function compare_in_bale($a, $b)
  {
    if ($a['design_name'] == $b['design_name']) {
      if ($a['colorway'] == $b['colorway']) {
            //identical
           return 0;
      }
      return ($a['colorway']  < $b['colorway'])) ? -1 : 1;
  }
  return ($a['design_name']  < $b['design_name'])) ? -1 : 1;
 }

注意してください、あなたはより良い比較演算子が欲しいかもしれません==が、これはあなたを十分に近づけるはずです。

于 2012-11-28T14:33:03.507 に答える
1

私はあなたのポイントを逃している可能性がありますが、これを試してください:

<?php
$data = array(
    array(
        'bale' => 2,
        'design' => 'D1',
        'color' => 'RED'
    ),
    array(
        'bale' => 2,
        'design' => 'D1',
        'color' => 'BLUE'
    ),
    array(
        'bale' => 1,
        'design' => 'D2',
        'color' => 'BLUE'
    ),
    array(
        'bale' => 2,
        'design' => 'D3',
        'color' => 'PINK'
    ),
    array(
        'bale' => 1,
        'design' => 'D1',
        'color' => 'WHITE'
    ),
);

$bale = array();
$design = array();
$color = array();
// Obtain a list of columns
foreach ($data as $key => $row) {
    $bale[$key]  = $row['bale'];
    $design[$key] = $row['design'];
    $color[$key] = $row['color'];
}
array_multisort($bale, SORT_ASC, $design, SORT_ASC, $color, SORT_ASC, $data);
var_dump($data);
?>

結果は次のとおりです。

array(5) {
  [0]=>
  array(3) {
    ["bale"]=>
    int(1)
    ["design"]=>
    string(2) "D1"
    ["color"]=>
    string(5) "WHITE"
  }
  [1]=>
  array(3) {
    ["bale"]=>
    int(1)
    ["design"]=>
    string(2) "D2"
    ["color"]=>
    string(4) "BLUE"
  }
  [2]=>
  array(3) {
    ["bale"]=>
    int(2)
    ["design"]=>
    string(2) "D1"
    ["color"]=>
    string(4) "BLUE"
  }
  [3]=>
  array(3) {
    ["bale"]=>
    int(2)
    ["design"]=>
    string(2) "D1"
    ["color"]=>
    string(3) "RED"
  }
  [4]=>
  array(3) {
    ["bale"]=>
    int(2)
    ["design"]=>
    string(2) "D3"
    ["color"]=>
    string(4) "PINK"
  }
}

http://php.net/manual/en/function.array-multisort.phpもチェックしてください

于 2012-11-28T14:45:32.673 に答える