我有一个关于在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)
对于你的具体情况,我建议你有一个对象数组,因为元素0和1是相似的,并且将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;
}
此函数可以在结果数组中返回完整数组,只要它们是您要搜索的键的值
我希望你发表评论,因为我认为我不太了解你的问题。
如果您没有越过它,网站上还有另一个类似的帖子 How to run array_filter recursively in a PHP array?
答案 1 :(得分:1)
这个uses iterators最实用的解决方案:
$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的一个被低估的功能,虽然它们有时会有一个棘手的语法,在这种情况下,你对节点而不是叶子感兴趣,需要额外的模式参数。然而,递归迭代器确实简化了许多递归操作。
答案 2 :(得分:0)
你可以尝试这种方式也只是为了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);
答案 3 :(得分: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;
}
现在正在工作!
编辑:解释:
使用“==”检查查找是否相等而不管类型如何,所以当它遇到一个整数时,它会将两个值都转换为interger int('anystring')得到的结果为0,所以键0 = string 'mediacontent'