[英]Sort Multidimentional Arrays in PHP without Keys
我想對多維數組進行排序,但是我沒有使用鍵來創建它 。 我使用數據庫中不同表中的一些列,使用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 * $ amount)稍后過濾為“借方”或“貸方”,如下所示。
我使用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
有很多方法可以實現您的目標。 最好的方法很可能是從數據庫中獲取已經排序的數據。 這樣,代碼更加清晰。
在不更改數據庫查詢和現有數據結構中任何內容的情況下,PHP函數array_column()
和array_multisort()
可以通過兩個簡單的步驟幫助您實現目標:
Date
的值提取到名為$date
的新數組中(需要array_multisort()
進行排序); array_multisort()
同時對新數組$date
和$Array
進行排序。 $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
循環提取日期
結合使用usort
和用戶定義的排序功能
<?php
function compare($a, $b) {
return strcmp($a[0], $b[0]);
}
usort($Array, "compare");
?>
比較函數可以是任何返回整數值的東西
<0,表示$ a小於$ b
$ a的0等於$ b
> 0,表示$ a大於$ b
似乎使用舊的冒泡排序算法可能是唯一的解決方案...
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.