Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中按键过滤多维数组_Php_Arrays_Recursion - Fatal编程技术网

在PHP中按键过滤多维数组

在PHP中按键过滤多维数组,php,arrays,recursion,Php,Arrays,Recursion,我有一个关于在PHP中过滤多维数组的问题。 我想要实现的是从现有数组中提取一个特定的数组元素(mediacontent的值)。 到目前为止,我得到的是: 现有多维数组: $multidimensional_array = array( 'entry' => array( 0 => array( 'width' => array( '$t' => '1536' ),

我有一个关于在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新手,希望你们能给我指出正确的方向,告诉我我做错了什么

我在以下(备选)网站上做了研究,但找不到适合我需要的答案


对于您的具体情况,我建议您使用一个对象数组,因为元素0和1类似,并且将mediacontent作为内部变量

如果你真的想这样做,你可以只通过使用一个映射得到一个mediacontent数组

 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;

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

我想请你评论一下,因为我想我还不太明白你的问题

此外,还有另一个类似的职位在网站上的情况下,你还没有越过它

您也可以尝试这种方式,仅用于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 getMediaContent($item){
        return $item['mediagroup']['mediacontent'];
    }
    $mediacontent = array_map('getMediaContent', $multidimensional_array['entry']);
    print '<pre>';
    print_r($mediacontent);
$多维数组=数组(
'entry'=>数组(
0=>数组(
“宽度”=>数组(
“$t”=>“1536”
),
“高度”=>数组(
“$t”=>“2048”
),
'id'=>数组(
“$t”=>“878974”
),
“媒体组”=>阵列(
“mediacontent”=>数组(
'url'=>'http://website/urltotheobject.png',
“宽度”=>384,
“中等”=>“图像”,
'键入'=>'图像/jpeg',
“高度”=>512
)
)
),
1=>数组(
“宽度”=>数组(
“$t”=>“5486”
),
“高度”=>数组(
“$t”=>“1144”
),
'id'=>数组(
“$t”=>“485435”
),
“媒体组”=>阵列(
“mediacontent”=>数组(
'url'=>'http://website/urltotheobject.png',
“宽度”=>512,
“中等”=>“图像”,
'键入'=>'图像/jpeg',
“高度”=>384
)
)
)
)
);
函数getMediaContent($item){
返回$item['mediagroup']['mediacontent'];
}
$mediacontent=array_-map('getMediaContent',$多维_-array['entry']);
打印“”;
打印(mediacontent);

最实用的解决方案:

这将输出:

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的一个非常不受重视的特性,尽管它们有时有一个复杂的语法,在本例中,您对节点而不是叶感兴趣,需要额外的mode参数。然而,递归迭代器确实简化了许多递归操作

现在开始工作

编辑:解释:


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

不需要重复,只需简单的循环即可。所以你想清除那些,例如,
mediacontent
width大于一个特定的值吗?是的,不要使用递归,如果你只想从原始数组中获取一些数据,只需构建一个新的数组并返回。我实际上会使用对象和类方法,但如果你真的想要递归,请检查我的答案
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
)
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;
}