簡體   English   中英

在不帶鍵的PHP中對多維數組進行排序

[英]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()可以通過兩個簡單的步驟幫助您實現目標:

  1. Date的值提取到名為$date的新數組中(需要array_multisort()進行排序);
  2. 使用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或更早版本,那么 可以使用一個簡單foreach循環提取日期 更好地升級你的PHP。

結合使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM