我想对多维数组进行排序,但我还没有使用键来创建它。 我使用数据库中不同表的一些列来使用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
答案 0 :(得分:1)
有很多方法可以实现您的目标。最好的方法是,最好的方法是从数据库中获取数据。这样代码就更清晰了。
不改变数据库查询和现有数据结构中的任何内容,PHP函数array_column()
和array_multisort()
可以通过两个简单的步骤帮助您实现目标:
Date
的值提取到名为$date
的新数组中(array_multisort()
需要进行排序); $date
同时对新数组$Array
和array_multisort()
进行排序。 $date
按升序排序,$Array
模仿$date
键上操作的更改(其值也按Date
排序)。代码简单如下:
$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或旧版本,那么您 可以使用简单的 更好地升级您的PHP 强> 的foreach
循环来提取日期
答案 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);