簡體   English   中英

“簡單”多級數組上的 PHP Array_filter

[英]PHP Array_filter on "simple" multi-level array

我可以以及如何使用 PHP 的array_filter從以下數組結構中過濾空白/空條目?

From:數組來自使用 Fetch BOTH 的 PDO 調用,因此在這種情況下,數值和命名值始終相等。

Array
(
    [2400] => Array
        (
            [0] => Array
                (
                    [value] => 7
                    [0] => 7
                )
            [1] => Array
                (
                    [value] => 61
                    [0] => 61
                )
            [2] => Array
                (
                    [value] => 42
                    [0] => 42
                )
            [3] => Array
                (
                    [value] => 
                    [0] => 
                )
        )
)

至:

Array
(
    [2400] => Array
        (
            [0] => Array
                (
                    [value] => 7
                    [0] => 7
                )
            [1] => Array
                (
                    [value] => 61
                    [0] => 61
                )
            [2] => Array
                (
                    [value] => 42
                    [0] => 42
                )
        )
)

我努力了

  • 普通的舊array_filter
  • array_filter(array, function($f){ ??? })不太確定從這里去哪里...我打算對數組進行深入研究,但這將如何影響通過array_filter的條目? 真/假返回不會帶來整個 [2400] 數組部分嗎? 它只是讓我感到困惑。

請對問題提出改進建議

使用array_filter並測試value元素(或0元素,因為它們是等效的)。

$array[2400] = array_filter($array[2400], function($element) {
    return $element['value'];
});

要對外部數組的所有元素執行此操作,請使用foreach循環。

foreach ($array as &$subarray) {
    $subarray = array_filter($subarray, function($element) {
        return $element['value'];
    });
}

array_map

$array = array_map(function($subarray) {
    return array_filter($subarray, function($element) {
        return $element['value'];
    });
}, $array);

我認為僅使用array_filter函數無法做到這一點,因為有時您需要修改數組元素,但array_filter函數僅允許決定是否應排除該元素。

例如,索引為 2400 的主數組元素應包含在結果集中,但應修改其內容。

我寫了一個簡單的函數來做到這一點,希望它可能會有所幫助。 好吧,你可能會用這個來獲得靈感。 這對我來說也是一個有趣的挑戰。

下面是我的功能與幾個測試。

<?php

function deepFilter(array $array)
{
    // Formally this is not need because if array is empty then $filteredArray will also be empty
    // but it simplifies the algorithm
    if (empty($array)) {
        return [];
    }

    $filteredArray = [];
    foreach ($array as $key => $value) {
        if (is_array($value) && !empty($value)) {
            $value = deepFilter($value);
        }
        if (!empty($value)) {
            $filteredArray[$key] = $value;
        }
    }

    return $filteredArray;
}

$testArray1 = [
    2400 => [
        0 => [
            'value' => 7,
            0 => 7,
        ],
        1 => [
            'value' => 61,
            0 => 61,
        ],
        2 => [
            'value' => 42,
            0 => 42,
        ],
        3 => [
            'value' => null,
            0 => null,
        ]
    ]
];

$testArray2 = [
    2400 => [
        0 => [
            'value' => 7,
            0 => 7,
        ],
        1 => [
            'value' => 61,
            0 => 61,
        ],
        2 => [
            'value' => 42,
            0 => 42,
        ],
        3 => null
    ],
    3243 => [
        0 => [
            'value' => 7,
            0 => null,
        ],
        1 => [
            'value' => null,
            0 => 61,
        ],
        2 => [
            'value' => 42,
            0 => 42,
        ],
        3 => null
    ]
];
var_export(deepFilter($testArray1));
var_export(deepFilter($testArray2));

這個想法很簡單。

  1. 取一個數組並逐個檢查元素。
  2. 如果 element 是一個數組,則對該元素應用函數並檢查結果。 我們可以從子數組中刪除所有內容,在這種情況下,我們不應該將其添加到結果中。 否則,如果孩子在清理后還有剩余的東西,請在我們的結果集中包含“清理過的孩子”。
  3. 如果我們的元素不是數組,則僅當它不為空時才包含它。

如果您發現任何錯誤或者它是否適合您,請告訴我。

如果數組結構保持不變,那么這應該有效:

foreach ($array as &$innerArray) {
    $innerArray = array_filter($innerArray, function($arr) { 
        return (!empty($arr[0]));
    });
}
unset($innerArray);

您可以通過array_map()array_filter()進行迭代調用,從而簡潔地過濾子集數據。 您可以通過調用本機函數array_sum() (或array_product()來避免為array_filter()編寫自定義函數——這會產生正確的真/假結果,因為任何具有空值的數據集都將被計算為0 ,以及其他所有內容非零(“真實”)。

代碼:(演示

var_export(
    array_map(fn($row) => array_filter($row, 'array_sum'), $array)
);

暫無
暫無

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

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