使用递归函数获取多维php数组的新值和键
Posted
技术标签:
【中文标题】使用递归函数获取多维php数组的新值和键【英文标题】:Get new value and keys of multidimensional php array with recursive function 【发布时间】: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()
删除重复项。
【参考方案1】:
您可以在递归执行函数时构建一个新数组并向其中添加元素。
这样的代码可以正常工作并按预期返回数组结构:
$array = [
'options' => [
'company_details' => [
'contact' => [
'company_name' => 'Some Name',
'email' => 'info@example.com',
'phone_mobile' => 043333333,
'phone_work' => 012222233
]
]
]
];
function enumerateKeys($array, &$keys = null)
$newArray = [];
if (!isset($keys))
$keys = [];
foreach ($array as $key => $value)
if (is_array($value))
$keys[] = $key; /* Moved below if() to enumerate only array keys */
return enumerateKeys($value, $keys);
$keys[] = $key;
$newArray[] = $keys;
array_pop($keys);
if (count($newArray) === count($array, true))
return $newArray;
$arrays = enumerateKeys($array);
$arrays
输出为:
array (size=4)
0 =>
array (size=4)
0 => string 'options' (length=7)
1 => string 'company_details' (length=15)
2 => string 'contact' (length=7)
3 => string 'company_name' (length=12)
1 =>
array (size=4)
0 => string 'options' (length=7)
1 => string 'company_details' (length=15)
2 => string 'contact' (length=7)
3 => string 'email' (length=5)
2 =>
array (size=4)
0 => string 'options' (length=7)
1 => string 'company_details' (length=15)
2 => string 'contact' (length=7)
3 => string 'phone_mobile' (length=12)
3 =>
array (size=4)
0 => string 'options' (length=7)
1 => string 'company_details' (length=15)
2 => string 'contact' (length=7)
3 => string 'phone_work' (length=10)
注意:如果您想要 company_name、email 等的值,只需将 if 后面的 $keys[] = $key;
更改为 $keys[] = $value;
。
【讨论】:
@Nash 我的回答对你有帮助吗?以上是关于使用递归函数获取多维php数组的新值和键的主要内容,如果未能解决你的问题,请参考以下文章