我有以下多維關聯陣列,我正在嘗試遞回遍歷它并使用每個元素父樹創建陣列
輸入陣列:
$user = [
'profile' => [
'authkey' => '',
'publickey' => '',
'status' => 19
],
'setup' => [
'profile' => false,
'contact' => false,
'payments' => false,
'subscription' => false
],
'paygateway' => [
'paypal' => [
'publickey' =>'',
'secretkey' => '',
'testarray' => [
'key1' => 'value1',
'key2' => 'value2',
'key3' => [
'key4' => 'level4'
]
],
'webhookid' => ''
],
'stripe' => [
'publickey' => '',
'secretkey' => ''
]
]
];
所需輸出:
array (
'profile' =>
array (
0 => '[profile][authkey]',
1 => '[profile][publickey]',
2 => '[profile][status]',
),
'setup' =>
array (
0 => '[setup][profile]',
1 => '[setup][contacts]',
2 => '[setup][payments]',
3 => '[setup][subscriptions]',
),
'paygateway' =>
array (
0 => '[paygateway][paypal][publickey]',
1 => '[paygateway][paypal][secretkey]',
2 => '[paygateway][paypal][testarray][key1]',
3 => '[paygateway][paypal][testarray][key2]',
4 => '[paygateway][paypal][testarray][key3][key4]',
5 => '[paygateway][paypal][webhookid]',
6 => '[paygateway][stripe][publickey]',
7 => '[paygateway][stripe][secretkey]',
),
)
我已經擁有的:
以下函式完美地遍歷整個陣列樹:
function testArray($array){
foreach($array as $key => $value){
if(is_array($value)){
echo "$key <br/>";
testArray($value);
}else{
echo "$key : $value <br/>";
}
}
}
testArray($user);
我無法弄清楚如何從結構中添加鍵并構建輸出陣列。
uj5u.com熱心網友回復:
為了保留原始的第一級鍵,我建議將每個第一級值傳遞給遞回函式。
在遞回函式中,當您有條件地深入子陣列時,構建格式化的鍵路徑字串。回傳每個級別上填充的關鍵路徑,并在上升樹時推送所有更深的填充路徑。
關于該array_push()行,它被用于將來自更深層次的回傳結果的所有元素單獨附加到當前層次的結果中。它可以寫成:
$result = array_merge($result, buildKeyPath($value, "{$path}[$key]"));
但我發現資料“傳播”array_push()更能表明正在執行的行程的型別。
代碼:(演示)
function buildKeyPath(array $array, string $path): array
{
$result = [];
foreach ($array as $key => $value) {
if (is_array($value)) {
array_push($result, ...buildKeyPath($value, "{$path}[$key]"));
} else {
$result[] = "{$path}[$key]";
}
}
return $result;
}
foreach ($user as $k => &$v) {
$v = buildKeyPath($v, "[$k]");
}
var_export($user);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/513469.html
