在没有键的PHP中对多维数组进行排序

时间:2016-05-09 21:13:04

标签: php arrays sorting

我想对多维数组进行排序,但我还没有使用键来创建它。 我使用数据库中不同表的一些列来使用for循环将类似的数据存储到数组中。

for($x = 0; $x < $numrows; $x++)
{
    $Array[$x][0] = mysql_result($result,$x,"Date");
    $Array[$x][1] = mysql_result($result,$x,"Ref");
    $Array[$x][2] = mysql_result($result,$x,"Amount");
}

第一张表是发票明细,第二张是付款。我试图打印一份声明。一切顺利,但不是按日期顺序。它按照我输入数组的顺序打印出来:所有发票金额,然后是所有付款金额。我将发票金额(-1 * $金额)过滤到借方或贷方以后输出。

我使用while循环打印,因为行数将继续增长。

硬编码测试代码:     

/*#############################
# Sort Multidimentional Array #
#############################*/

  //SET ARRAY

$Array [0][0] = "2016-01-01";
$Array [0][1] = "INV001";
$Array [0][2] = "-500.00";

$Array [1][0] = "2016-02-01";
$Array [1][1] = "INV002";
$Array [1][2] = "-550.00";

$Array [2][0] = "2016-01-05";
$Array [2][1] = "PAY001";
$Array [2][2] = "500.00";

$Array [3][0] = "2016-02-05";
$Array [3][1] = "PAY002";
$Array [3][2] = "500.00";


//SORT ARRAY

/*  Need some help here  */


//PRINT ARRAY
echo "<br/>Print out:<br/><br/>";

for ($x = 0; $x < 4; $x++ )
{
  for ($y = 0; $y < 3; $y++ )
  {
    echo "Array [$x][$y]: ".$Array[$x][$y]."<br/>";
  }
  echo "<br/>";
}

echo "<br/>Done";
?>

我想按日期顺序对此进行排序,以便在对其进行排序之后:

$Array [0][0] = "2016-01-01";
$Array [0][1] = "INV001";
$Array [0][2] = "-500.00";

$Array [1][0] = "2016-01-05";
$Array [1][1] = "PAY001";
$Array [1][2] = "500.00";

$Array [2][0] = "2016-02-01";
$Array [2][1] = "INV002";
$Array [2][2] = "-550.00";

$Array [3][0] = "2016-02-05";
$Array [3][1] = "PAY002";
$Array [3][2] = "500.00";

当前输出:

+------------+--------+----------+----------+
| DATE       | REF.   | DEBIT    | CREDIT   |
+------------+--------+----------+----------+
| 2016-01-01 | INV001 | R 500.00 |          |
+------------+--------+----------+----------+
| 2016-02-01 | INV002 | R 550.00 |          |
+------------+--------+----------+----------+
| 2016-01-05 | PAY001 |          | R 500.00 |
+------------+--------+----------+----------+
| 2016-02-05 | PAY002 |          | R 500.00 |
+------------+--------+----------+----------+

|                     BALANCE DUE: R  50.00

通缉输出:

+------------+--------+----------+----------+
| DATE       | REF.   | DEBIT    | CREDIT   |
+------------+--------+----------+----------+
| 2016-01-01 | INV001 | R 500.00 |          |
+------------+--------+----------+----------+
| 2016-01-05 | PAY001 |          | R 500.00 |
+------------+--------+----------+----------+
| 2016-02-01 | INV002 | R 550.00 |          |
+------------+--------+----------+----------+
| 2016-02-05 | PAY002 |          | R 500.00 |
+------------+--------+----------+----------+

|                     BALANCE DUE: R  50.00

3 个答案:

答案 0 :(得分:1)

有很多方法可以实现您的目标。最好的方法是,最好的方法是从数据库中获取数据。这样代码就更清晰了。

不改变数据库查询和现有数据结构中的任何内容,PHP函数array_column()array_multisort()可以通过两个简单的步骤帮助您实现目标:

  1. Date的值提取到名为$date的新数组中(array_multisort()需要进行排序);
  2. 使用$date同时对新数组$Arrayarray_multisort()进行排序。 $date按升序排序,$Array模仿$date键上操作的更改(其值也按Date排序)。
  3. 代码简单如下:

    $date = array_column($Array, 0);             // `Date` is in column 0
    array_multisort($date, SORT_ASC, $Array);
    // $Array is sorted by column 0 (aka `Date`)
    // $date can be unset() now
    

    自PHP 5.5起,PHP函数array_column()可用。如果您是旧版本的不幸用户,那么有一种简单的方法可以模拟它:

    function my_array_column($array, $column)
    {
        return array_map(
            function ($item) use ($column) {
                return $item[$column];
            },
            $array
        );
    }
    

    最后一段代码使用PHP 5.3中引入的匿名函数。如果您仍在使用PHP 5.3或旧版本,那么 可以使用简单的foreach循环来提取日期 更好地升级您的PHP

答案 1 :(得分:0)

使用<?php function compare($a, $b) { return strcmp($a[0], $b[0]); } usort($Array, "compare"); ?> 以及用户定义的排序功能

hasAttribute

比较函数可以是返回整数值的任何东西

&LT; 0美元,低于$ b

0表示$ a等于$ b

&GT; 0美元大于$ b

答案 2 :(得分:0)

似乎使用旧的冒泡排序算法可能是唯一的解决方案......

function bubbleSort(array $Array) 
{
    $array_size = count($Array);
    for($i = 0; $i < $array_size; $i ++) 
    {
        for($j = 0; $j < $array_size; $j ++) 
        {
            if ($Array[$i][0] < $Array[$j][0]) 
            {
                $temp1 = $Array[$i][0];
                $temp2 = $Array[$i][1];
                $temp3 = $Array[$i][2];

                $Array[$i][0] = $Array[$j][0];
                $Array[$i][1] = $Array[$j][1];
                $Array[$i][2] = $Array[$j][2];

                $Array[$j][0] = $temp;
                $Array[$j][1] = $temp;
                $Array[$j][2] = $temp;
            }
        }
    }
    return $Array;
}

$Array = bubbleSort($Array);