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,
    );
}

我需要按捆对值进行排序,然后告诉一捆的总价格和一捆中的物品数量。

ksort($sorted_by_bale);

Ksort 达到了目的。

现在我需要按设计(第一个)排序,然后是颜色(第二个)。

4

3 回答 3

1

您应该使用usort(参见文档)。这允许您使用自己的排序功能。

一个缺点是数组键被重置。但这对您的辅助阵列似乎无关紧要。

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

您需要我们使用自定义排序功能进行排序:

 //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 回答