关于“简单”多级数组的PHP Array_filter

时间:2016-05-05 17:07:48

标签: php arrays array-filter

我可以和如何使用PHP的array_filter过滤以下数组结构中的空/空条目吗?

发件人:该数组来自使用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]数组部分吗?它让我很困惑。

请建议改进​​问题

3 个答案:

答案 0 :(得分:2)

使用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);

答案 1 :(得分:2)

我认为仅使用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. 如果我们的元素不是数组,那么只有在它不为空时才包含它。
  4. 如果您发现任何错误或是否适合您,请告诉我。

答案 2 :(得分:1)

如果数组结构保持不变,那么这应该有效:

{{1}}