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