多维数组可以包含单个元素或另一个数组。如何遍历?

时间:2017-05-02 03:02:35

标签: php arrays multidimensional-array

这已经让我的大脑震惊了几天。我以为我有一个解决方案,但我发现很难找到一个始终工作的防弹代码。我正在遍历一个多维数组。我有两个函数,一个查看单行,另一个查看数组。我有一个数组的两个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'
              ]
         ]
     ]
]

非常感谢任何帮助。

修改

因为这不清楚。我正在寻找如何使父键应用于子值,无论该值是否是单个值,或者它是多个值的数组。关键父母需要适用于所有孩子,除非有另一个父键(理论上可以在父键下面有无限数量的子/父键。

最终

我设法解决了这个问题。感谢大家的帮助。

2 个答案:

答案 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的帖子有效,但是如果想从一个函数手动执行,你就可以这样做。

Try this code snippet here

<?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);
        }
    }
}