PHP 通过特定键过滤二维数组

问题描述 投票:0回答:3

我有这个数组:

Array
(
    [702a4584] => Array
        (
            [type] => folder
            [id] => 702a4584
        )

    [b547b3a9] => Array
        (
            [type] => folder
            [id] => b547b3a9

        )

    [fcb0d055] => Array
        (
            [type] => page
            [id] => fcb0d055
        )
)

我想过滤数组,以便仅保留类型“文件夹”:

Array
(
    [702a4584] => Array
        (
            [type] => folder
            [id] => 702a4584
        )

    [b547b3a9] => Array
        (
            [type] => folder
            [id] => b547b3a9

        )

)

我可以做到这一点,但我需要一个通用函数:

$temp = array();
foreach($array as $key => $value)
{
    if($value['type'] =="folder")
    {
        $temp[$key] = $value; 
    }
}
php multidimensional-array filtering
3个回答
20
投票

您可以使用

array_filter

$filtered = array_filter($array, function($v) { return $v['type'] == 'folder'; });

0
投票

我遇到了一个奇怪的情况,可能对将来的某人添加到这里很有用,因为当我搜索它时,它指向了这篇文章。

我正在使用 Laravel,当我转储

@dump($myData)
我的二维数组时,它显示为数组内的数组。但是,我的 filter_array 逻辑不起作用。

经过几个小时的尝试调试它,我使用了老式的

var_dump($myData)
并发现内部数组不是一个数组 - 它由于某种原因被转换为一个对象。它返回给我以下错误:
Cannot use object of type stdClass as array

又挣扎了一会儿,直到我想出了两个替代方案:

假设物体:

$filteredArray = array_filter($originalArray, function ($arr) {
    return $arr->id_filter_index === 101; // Working. For some reason, the $arr is an object.
});

强制数组转换:

$filteredArray = array_filter($originalArray, function ($arr) {
    $arr = json_decode(json_encode($arr), true); // Force converting to array.
    return $arr['id_filter_index'] === 101;
});

顺便说一句:

$originalArray
也被过滤了,不确定为什么内部数组变成了对象。如果有人有相关背景,请将其留在评论中。希望这可以为任何人节省宝贵的调试时间。


-1
投票
$input = Array(1,2,3,1,2,3,4,5,6);
$input = array_map("unserialize", array_unique(array_map("serialize", $input)));
© www.soinside.com 2019 - 2024. All rights reserved.