簡體   English   中英

如果缺少數組元素,則PHP重建多維數組

[英]PHP Rebuild Multi-Dimensional Array if array elements are missing

我有一個Multi-Dimesional數組,我想重建此數組,以便所有具有另一個數組具有的丟失數據(基本上替換丟失的數據)的所有第一級數組( array[] )。 我正在使用此數組構建圖形,因此我需要用0填充缺失的區域,否則我的圖形中會有巨大的空洞。

[numberof]是該給定圖的數量。 [date]是發生的月份。 如您所見,我是今天(3) ASC訂單:

電流輸出

Array
 (
[First] => Array
    (
        [0] => Array
            (
                [numberof] => 1
                [date] => 12
            )

        [1] => Array
            (
                [numberof] => 2
                [date] => 1
            )

        [2] => Array
            (
                [numberof] => 2
                [date] => 2
            )

        [3] => Array
            (
                [numberof] => 25
                [date] => 3
            )

    )

[Second] => Array
    (
        [0] => Array
            (
                [numberof] => 1
                [date] => 1
            )

        [1] => Array
            (
                [numberof] => 2
                [date] => 2
            )

        [2] => Array
            (
                [numberof] => 1
                [date] => 3
            )

    )

[Third] => Array
    (
        [0] => Array
            (
                [numberof] => 1
                [date] => 2
            )

    )
)

期望的結果

Array
 (
[First] => Array
    (
        [0] => Array
            (
                [numberof] => 1
                [date] => 12
            )

        [1] => Array
            (
                [numberof] => 2
                [date] => 1
            )

        [2] => Array
            (
                [numberof] => 2
                [date] => 2
            )

        [3] => Array
            (
                [numberof] => 25
                [date] => 3
            )

    )

[Second] => Array
    (
        [0] => Array //ADDED and given a value of 0
            (
                [numberof] => 0
                [date] => 12
            )

        [1] => Array
            (
                [numberof] => 1
                [date] => 1
            )

        [2] => Array
            (
                [numberof] => 2
                [date] => 2
            )

        [3] => Array
            (
                [numberof] => 1
                [date] => 3
            )

    )

[Third] => Array
    (

        [0] => Array //ADDED and given a value of 0
            (
                [numberof] => 0
                [date] => 12
            )

        [1] => Array  //ADDED and given a value of 0
            (
                [numberof] => 0
                [date] => 1
            )
        [2] => Array
            (
                [numberof] => 1
                [date] => 2
            )

        [3] => Array //ADDED and given a value of 0
            (
                [numberof] => 0
                [date] => 3
            )
    )
)

在我看來這是不可能的。 但是也許我還沒有掌握技能,到目前為止我已經嘗試過了:

注意,這就是我大聲說的 ..我只是無法理解該怎么做,遍歷數組,檢查它是否具有numbr值,如果沒有添加它。 但是,如果最后一行是月份最多的那一行而第一個月只有1個月怎么辦?

編輯

MySQL

$sql = sprintf("SELECT count(*) as numberOf, MONTH(s.sextime) as date FROM sex s, users u WHERE %s AND s.uid = u.uid AND s.sextime >= DATE_SUB(CURRENT_DATE, INTERVAL %d MONTH) GROUP BY MONTH(s.sextime) ORDER BY s.sextime ASC;", $type, $months);

這是PHP生成上述數組並調用sql的過程:

    $info['info']['First'] = $this->dataStore->grabSexesByMonth('AND s.sexnumber=1');
    $info['info']['Second'] = $this->dataStore->grabSexesByMonth('AND s.sexnumber=2');
    $info['info']['Third'] = $this->dataStore->grabSexesByMonth('AND s.sexnumber=3');

一個三步過程可能會起作用:

$fillTo = array('key'=>'','count'=>0);
foreach($array as $k => $data) {
    if (count($data) > $fillTo['count']) {
        $fillTo['key'] = $k;
        $fillTo['count'] = count($data);
    }
}

$fillData = $array[$fillTo['key']];
foreach($fillData as $k => &$data) {
    $data['numberof'] => 0;
}

foreach($array as $k => &$data) {
    if ($k === $fillTo['key'])
        continue;

    $data = $data + $fillData;
}

var_dump($array);

不幸的是, MySQL沒有設置返回函數,例如PostgreSQL generate_series 這使事情變得有些復雜,因為您需要以編程方式生成所有日期的集合。 另外,您應該使用EXTRACT(YEAR_MONTH FROM sextime)而不是MONTH(sextime) ,否則您將混合不同年份的月份的總和。

$months = 4;

# emulate GENERATE_SERIES
for ($i = $months-1; $i >= 0; $i--) {
  $gen_series[] = "SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE - INTERVAL $i MONTH) extr";
}
$gen_series = join(' UNION ', $gen_series);


$sql = sprintf("SELECT
                  fll.sexnumber,
                  fll.extr as date,
                  COUNT(u.uid) as numberOf
                FROM
                  (SELECT
                    dts.extr,
                    sxn.sexnumber
                  FROM
                    (%s) dts,
                    (SELECT DISTINCT sexnumber FROM sex) sxn) fll LEFT JOIN sex s
                ON
                  fll.extr = EXTRACT(YEAR_MONTH FROM s.sextime) AND fll.sexnumber=s.sexnumber LEFT JOIN users u
                ON
                  s.uid = u.uid
                GROUP BY
                  fll.sexnumber,
                  fll.extr
                ORDER BY
                  fll.sexnumber,
                  fll.extr", $gen_series);

echo $sql;

上面的PHP代碼將輸出以下SQL查詢。

SELECT
  fll.sexnumber,
  fll.extr as date,
  COUNT(u.uid) as numberOf
FROM
  (SELECT
    dts.extr,
    sxn.sexnumber
  FROM
    (SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE - INTERVAL 3 MONTH) extr UNION SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE - INTERVAL 2 MONTH) extr UNION SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE - INTERVAL 1 MONTH) extr UNION SELECT EXTRACT(YEAR_MONTH FROM CURRENT_DATE - INTERVAL 0 MONTH) extr) dts,
    (SELECT DISTINCT sexnumber FROM sex) sxn) fll LEFT JOIN sex s
ON
  fll.extr = EXTRACT(YEAR_MONTH FROM s.sextime) AND fll.sexnumber=s.sexnumber LEFT JOIN users u
ON
  s.uid = u.uid
GROUP BY
  fll.sexnumber,
  fll.extr
ORDER BY
  fll.sexnumber,
  fll.extr;

在相同的數據集上運行它,您將從MySQL獲得以下輸出。

+-----------+--------+----------+
| sexnumber | date   | numberOf |
+-----------+--------+----------+
|         1 | 201312 |        1 |
|         1 | 201401 |        2 |
|         1 | 201402 |        2 |
|         1 | 201403 |       25 |
|         2 | 201312 |        0 |
|         2 | 201401 |        1 |
|         2 | 201402 |        2 |
|         2 | 201403 |        1 |
|         3 | 201312 |        0 |
|         3 | 201401 |        0 |
|         3 | 201402 |        1 |
|         3 | 201403 |        0 |
+-----------+--------+----------+
12 rows in set (0.01 sec)

因此,您只需1個查詢(而不是3個查詢)即可獲得所需的內容,而無需處理多余的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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