PHP数组“过滤器打开”;简单的;多级阵列

PHP数组“过滤器打开”;简单的;多级阵列,php,arrays,array-filter,Php,Arrays,Array Filter,我可以并且如何使用PHP的array\u filter从以下数组结构中过滤空/空条目 From:该数组来自使用Fetch和Fetch的PDO调用,因此在这种情况下,数值和命名值始终相等 Array ( [2400] => Array ( [0] => Array ( [value] => 7 [0] => 7

我可以并且如何使用PHP的
array\u filter
从以下数组结构中过滤空/空条目

From:该数组来自使用Fetch和Fetch的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
                )
        )
)
我试过了

  • 普通旧
    数组\u过滤器
  • array\u过滤器(数组,函数($f){???})
    并且不太确定从这里到哪里去。。。我本打算让数组深入研究它,但这将如何影响通过
    array\u filter
    的条目?真/假返回不会带来整个[2400]数组部分吗?这让我很困惑

请建议对问题的改进

使用
array\u filter
并测试
value
元素(或
0
元素,因为它们是等效的)

要对外部数组的所有元素执行此操作,请使用
foreach
循环

foreach ($array as &$subarray) {
    $subarray = array_filter($subarray, function($element) {
        return $element['value'];
    });
}
数组\u映射

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

如果阵列结构保持不变,则这应该可以工作:

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

我认为仅使用函数无法做到这一点,因为有时需要修改数组元素,但
array\u 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));

<代码> DOD,您想删除任何空的或两者都无效的ANTY?任何空的或空的,计算为“false”的正常标准,您可以使用<代码> ARAYYMAP 浏览和删除空数组。@ AgTestFravaTurr如果数字元素是空的,但命名元素不是,反之亦然呢?或者它们总是等价的,就像在你的例子中那样?看起来这些数组来自
mysqli\u fetch\u数组
,它为每个选定列返回数字和命名元素,它们是相同的。hmm。。“2400”键是可变的,可以更改。所以循环数组的所有元素。是的,这就是我在尝试其他答案中的建议时遇到的问题。它将为我提供空白数组,而不是完全排除该键。我确实创建了自己的函数来循环数组并逐个检查元素,这完全符合我的需要。我相信你最好地回答了我的问题,“array_filter是否适用于此?”
<?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));