这已经让我的大脑震惊了几天。我以为我有一个解决方案,但我发现很难找到一个始终工作的防弹代码。我正在遍历一个多维数组。我有两个函数,一个查看单行,另一个查看数组。我有一个数组的两个poetential配置。
第一个例子
[
'Person' => [
'Name' => 'John Smith'
]
]
(一个人的一个结果,只有一个人的名字。)
第二个例子
[
'Person' => [
'Name' => [
0 => 'John Smith',
1 => 'John Denver'
]
]
]
(一个人,该人有多个名字。)
第三个例子
[
'Person' => [
0 => [
'Name' => 'John Smith'
],
1 => [
'Name' => 'Jane Doe'
]
]
]
(两个人,每人只有一个名字。)
第四个例子
[
'Person' => [
0 => [
'Name' => [
0 => 'John Smith',
1 => 'John Denver'
]
],
1 => [
'Name' => 'Jane Doe'
]
]
]
(两个人,第一个有两个名字,第二个只有一个。)
希望这是我所说的。当某事物只有1条记录时,它将返回单条记录。如果有多个记录,则会有一个包含每个记录的数组。
我需要从头到尾横穿多维数组。我想弄清楚如何检查是否有一个答案或多个答案。
我已经尝试检查数组键名,检查键是整数还是字符串,以及是否是某个数组。
没有什么比我想象的更好。任何人都可以帮助提供横向和检查方法,例如使用 foreach循环或函数吗?
如果有帮助,我有另一个数组,其中包含它试图查找的关键字段的名称。该数组的布局与此类似:
[
'Person' => [
'type' => 'array',
'subfields' => [
'Name' => [
'type' => 'string'
]
]
]
]
非常感谢任何帮助。
修改
因为这不清楚。我正在寻找如何使父键应用于子值,无论该值是否是单个值,或者它是多个值的数组。关键父母需要适用于所有孩子,除非有另一个父键(理论上可以在父键下面有无限数量的子/父键。
最终
我设法解决了这个问题。感谢大家的帮助。
答案 0 :(得分:0)
如果您只想尝试获取人员列表,可以使用 array_walk_recursive 对数据进行规范化,将其恢复为完整性,作为任一格式的名称列表。
function normaliseData($peopleData) {
$people = [];
array_walk_recursive($peopleData, function($item, $key) use(&$people) {
$people[] = $item;
});
return $people;
}
print_r(normaliseData($first)); // Array ( [0] => John Smith )
print_r(normaliseData($second)); // Array ( [0] => John Smith [1] => John Denver )
print_r(normaliseData($third)); // Array ( [0] => John Smith [1] => Jane Doe )
print_r(normaliseData($fourth)); // Array ( [0] => John Smith [1] => John Denver [2] => Jane Doe )
答案 1 :(得分:0)
对于这个array_walk_recursive
是最好的选项,因为@JasonBoss
的帖子有效,但是如果想从一个函数手动执行,你就可以这样做。
<?php
ini_set('display_errors', 1);
$array1=[
'Person' => [
'Name' => 'John Smith'
]
];
$array2=[
'Person' => [
'Name' => [
0 => 'John Smith',
1 => 'John Denver'
]
]
];
$array3=[
'Person' => [
0 => [
'Name' => 'John Smith'
],
1 => [
'Name' => 'Jane Doe'
]
]
];
$array4=[
'Person' => [
0 => [
'Name' => [
0 => 'John Smith',
1 => 'John Denver'
]
],
1 => [
'Name' => 'Jane Doe'
]
]
];
$result=array();
getRecords($array1);
print_r($result);
$result=array();
getRecords($array2);
print_r($result);
$result=array();
getRecords($array3);
print_r($result);
$result=array();
getRecords($array4);
print_r($result);
function getRecords($array)
{
global $result;
foreach($array as $key => $value)
{
if(is_string($value))
{
$result["names"][]=$value;
}
elseif(is_array($array[$key]) && count($array[$key]))
{
getRecords($value);
}
}
}