在PHP中按键搜索多维数组

3
我有一个关于在PHP中过滤多维数组的问题。 我想要实现的是从现有数组中提取特定的数组元素(即mediacontent的值)。 这是我目前得到的:

现有的多维数组:

$multidimensional_array = array(
    'entry' => array(
        0 => array(
            'width' => array(
                '$t' => '1536'
            ),
            'height' => array(
                '$t' => '2048'
            ),
            'id' => array(
                '$t' => '878974'
            ),
            'mediagroup' => array(
                'mediacontent' => array(
                    'url' => 'http://website/urltotheobject.png',
                    'width' => 384,
                    'medium' => 'image',
                    'type' => 'image/jpeg',
                    'height' => 512
                )
            )
        ),
        1 => array(
            'width' => array(
                    '$t' => '5486'
            ),
            'height' => array(
                    '$t' => '1144'
            ),
            'id' => array(
                '$t' => '485435'
            ),
            'mediagroup' => array(
                'mediacontent' => array(
                    'url' => 'http://website/urltotheobject.png',
                    'width' => 512,
                    'medium' => 'image',
                    'type' => 'image/jpeg',
                    'height' => 384
                )
            )   
        )
    )
);

一个(没有正常工作的)用于过滤数组的函数
function filterResponseByKey($keyToFilter,$array){

    foreach ($array as $key => $value) 
    {
        if($key == $keyToFilter)
        {
            return $value;
        }
        elseif(is_array($value))
        {
            $result = filterResponseByKey($keyToFilter, $value);

            if($result != false)
            {
                return $result;             
            }
        }
    }
    return false;
}

我相对于PHP比较新,希望你们能指点我方向并告诉我这里做错了什么。
我已经在以下(备选)网站上进行了研究,但是没有找到符合我的需求的答案。 理解递归PHP过滤数组

1
不需要递归,只需简单地循环遍历。所以您想清除那些宽度大于特定值的mediacontent,是吗? - vaso123
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Gerifield
我会使用对象和类的方法,但如果你真的想要递归,请查看我的答案。 - zardilior
这个问题不清楚,因为它没有包含一个 [mcve]。我们不知道你是想要第一个找到的匹配项还是所有找到的匹配项。我们也不知道递归是否真的必要。这个页面不适合在 Stack Overflow 上提问。 - mickmackusa
4个回答

1
对于你的特定情况,我建议使用对象数组,因为元素0和1相似,并且具有媒体内容作为内部变量。
如果你真的想这样做,你可以通过使用map获取媒体内容的数组。
 array_map($multidimensional_array['entry'],function($obj){
     return $obj['mediagroup']['mediacontent'];
 });

如果您想要的是更具动态性和递归性的内容
 function recursive_filter_by_key($keyname,$list){
    $result=[];
    foreach($list as $key=>$obj){
         if($key==$keyname) 
            array_push($result,$obj);

         else if(gettype($obj)=='array')//not necesary to check if its equal to the $key as this wouldn't run if it was
                 $result = array_merge($result,recursive_filter_by_key($obj));
    }
    return $result;

 }

只要它们是您正在搜索的键的值,此函数可以在其结果数组中返回完整的数组。

我希望您进行评论,因为我认为我没有完全理解您的问题。

此外,如果您还没有看到,网站上还有另一篇类似的帖子如何在PHP数组中递归运行array_filter?


1
这个使用迭代器的解决方案最为实用:
$iter = new RecursiveIteratorIterator(
                new RecursiveArrayIterator($multidimensional_array),
                RecursiveIteratorIterator::SELF_FIRST
);
foreach($iter as $key => $value) {
  if(ctype_alpha($key) && $key == 'mediacontent') {
    echo "Media Content: ".print_r($value, true)."\n";
  }
}

这会输出:
Media Content: Array
(
    [url] => http://website/urltotheobject.png
    [width] => 384
    [medium] => image
    [type] => image/jpeg
    [height] => 512
)

Media Content: Array
(
    [url] => http://website/urltotheobject.png
    [width] => 512
    [medium] => image
    [type] => image/jpeg
    [height] => 384
)

迭代器是 PHP 中一个被低估的特性,虽然有时语法比较棘手,而且在这种情况下,您需要关注节点而不是叶子,需要额外的模式参数。然而,递归迭代器确实简化了许多递归操作。

0

你也可以尝试这种方式来处理媒体内容...

$multidimensional_array = array(
        'entry' => array(
            0 => array(
                'width' => array(
                    '$t' => '1536'
                ),
                'height' => array(
                    '$t' => '2048'
                ),
                'id' => array(
                    '$t' => '878974'
                ),
                'mediagroup' => array(
                    'mediacontent' => array(
                        'url' => 'http://website/urltotheobject.png',
                        'width' => 384,
                        'medium' => 'image',
                        'type' => 'image/jpeg',
                        'height' => 512
                    )
                )
            ),
            1 => array(
                'width' => array(
                    '$t' => '5486'
                ),
                'height' => array(
                    '$t' => '1144'
                ),
                'id' => array(
                    '$t' => '485435'
                ),
                'mediagroup' => array(
                    'mediacontent' => array(
                        'url' => 'http://website/urltotheobject.png',
                        'width' => 512,
                        'medium' => 'image',
                        'type' => 'image/jpeg',
                        'height' => 384
                    )
                )
            )
        )
    );

    function getMediaContent($item){
        return $item['mediagroup']['mediacontent'];
    }
    $mediacontent = array_map('getMediaContent', $multidimensional_array['entry']);
    print '<pre>';
    print_r($mediacontent);

0
function filterResponseByKey($keyToFilter,$array){

    foreach ($array as $key => $value) 
    {
        if($key === $keyToFilter)
        {
            return $value;
        }
        elseif(is_array($value))
        {
            $result = filterResponseByKey($keyToFilter, $value);

            if($result != false)
            {
                return $result;             
            }
        }
    }
    return false;
}

正在工作中!

编辑:解释如下:

使用“==”检查是否相等,无论类型如何,因此当它遇到一个整数时,它将强制将两个值转换为整数int('anystring')的结果为0,因此键0 =字符串'mediacontent'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接