【发布时间】:2021-10-29 16:01:01
【问题描述】:
如何使以下函数适用于无限的嵌套数组,而无需像我那样手动执行此操作? (不使用嵌套在另一个 foreach 中的 foreach)。
这是一个数组,但可以嵌套更多并且有更多数据:
Array
(
[options] => Array
(
[company_details] => Array
(
[contact] => Array
(
[company_name] => Some Name
[email] => info@example.com
[phone_mobile] => 043333333
[phone_work] => 012222233
)
)
)
[another_array] => some_data
)
循环:
foreach ($form_data as $key=>$value) { // options/css/etc..
$key_1 = $key;
if (!is_array($value)) {
$new_value = $form_data[$key_1];
$array[$key_1] = $new_value;
}
if (is_array($value)) {
foreach ($value as $key=>$value) { // company_details/shop_settings/etc..
$key_2 = $key;
if (!is_array($value)) {
$new_value = $form_data[$key_1][$key_2];
$array[$key_1][$key_2] = $new_value;
}
if (is_array($value)) {
foreach ($value as $key=>$value) { // contact/social_links/etc..
$key_3 = $key;
if (!is_array($value)) {
$new_value = $form_data[$key_1][$key_2][$key_3];
$array[$key_1][$key_2][$key_3] = $new_value;
}
if (is_array($value)) {
foreach ($value as $key=>$value) { // email/mobile/etc..
$key_4 = $key;
if (!is_array($value)) {
$new_value = $form_data[$key_1][$key_2][$key_3][$key_4];
$array[$key_1][$key_2][$key_3][$key_4] = $new_value;
}
if (is_array($value)) {
foreach ($value as $key=>$value) { // email/mobile/etc..
$key_5 = $key;
if (!is_array($value)) {
$new_value = $form_data[$key_1][$key_2][$key_3][$key_4][$key_5];
$array[$key_1][$key_2][$key_3][$key_4][$key_5] = $new_value;
}
}
}
}
}
}
}
}
}
}
我试过THIS,但问题是数组没有停在最后一个键处。所以改为得到这个:
function enumerateKeys($array, &$keys) {
if(!isset($keys)) {
$keys = array();
}
foreach($array as $key => $value) {
if(is_array($value)) {
$keys[] = $key; /* Moved below if() to enumerate only array keys */
enumerateKeys($value, $keys);
}
}
}
// EXPECTED OUTPUT:
Array
(
[0] => options
[1] => company_details
[2] => contact
[4] => company_name
)
Array
(
[0] => options
[1] => company_details
[2] => contact
[4] => email
)
Array
(
[0] => options
[1] => company_details
[2] => contact
[4] => phone_number
)
我得到了这个:
// WRONG OUTPUT:
Array
(
[0] => options
[1] => company_details
[2] => contact
)
Array
(
[0] => options
[1] => company_details
[2] => contact
)
Array
(
[0] => options
[1] => company_details
[2] => contact
)
我也尝试添加最后一个键,但是它没有得到索引键号并且在最后一个键之后它没有停止,它只是向数组中添加更多数据,像这样将所有东西混合在一起:
function enumerateKeys($array, &$keys) {
if(!isset($keys)) {
$keys = array();
}
foreach($array as $key => $value) {
if(is_array($value)) {
$keys[] = $key; /* Moved below if() to enumerate only array keys */
enumerateKeys($value, $keys);
}
$keys[$key] = $value;
}
}
//OUTPUT:
Array
(
[0] => options
[1] => company_details
[2] => contact
[company_name] => Some Name
)
Array
(
[0] => options
[1] => company_details
[2] => contact
[company_name] => Some Name
[email] => info@example.com
)
Array
(
[0] => options
[1] => company_details
[2] => contact
[company_name] => Some Name
[email] => info@example.com
[phone_mobile] => 04333333333
)
【问题讨论】:
-
输入是什么?
-
@Barmar 我已经编辑了我的问题,您可以在问题顶部找到数组
-
另一个问题只想要其中包含嵌套数组的数组元素的键。从
if中取出$keys[] = $key;以获取所有密钥。 -
@Barmar 我已将其移至
if上方,但现在我在末尾得到了 4 个等于数组,每个数组都有所有键。options|company_details|contact|company_name|email|phone_number|etc.. -
您可以使用
array_unique()删除重复项。
标签: php arrays recursion multidimensional-array nested