我正在嘗試獲取多維陣列的所有鍵并以某種方式格式化它們。這是一個部分陣列:
$ini_config['aaa']['email']['main'] = '[email protected]';
$ini_config['bbb']['email']['ccc'] = '[email protected]';
$ini_config['bbb']['phone']['local'] = '800-555-1212';
$ini_config['bbb']['phone']['skype'] = '744-222-1234';
$ini_config['ccc']['phone']['main'] = 'domain.com';
$ini_config['ccc']['domain']['https'] = 'https://www. domain.com';
$ini_config['ccc']['fax'] = '744-222-1237';
這是我需要它們的格式:
aaa_email_main
bbb_email_ccc
bbb_phone_local
bbb_phone_skype
ccc_phone_main
ccc_domain_https
ccc_fax
這個腳本是我最接近我需要的:
<?php
rloop($ini_config);
function rloop($array) {
global $full_key;
foreach($array as $key => $value) {
if(is_array($value) ) {
$full_key .= $key .'_';
$array[$key] = rloop($array[$key]);
}
else {
$array[$key] = (string) $value;
$filename = $full_key . $key;
echo 'filename: '. $filename . PHP_EOL;
$full_key = '';
}
}
}
NB 級別的數量可以從 1 到 4,并且所有的鍵都是字串。
謝謝
uj5u.com熱心網友回復:
$ini_config['aaa']['email']['main'] = '[email protected]';
$ini_config['bbb']['email']['ccc'] = '[email protected]';
$ini_config['bbb']['phone']['local'] = '800-555-1212';
$ini_config['bbb']['phone']['skype'] = '744-222-1234';
$ini_config['ccc']['phone']['main'] = 'domain.com';
$ini_config['ccc']['domain']['https'] = 'https://www. domain.com';
$ini_config['ccc']['fax'] = '744-222-1237';
function keyPaths(array $array, array $carry = [], string $separator = ''): array {
foreach ($array as $key => $value) {
if (is_array($value)) {
$carry = keyPaths($value, $carry, $separator . $key . '_');
} else {
$carry[] = $separator . $key;
}
}
return $carry;
}
$result = keyPaths($ini_config);
uj5u.com熱心網友回復:
感謝@lucas.j,這就是我現在正在使用的:
function get_all_keys($array, $collector='') {
$separator = '_';
foreach ($array as $key => $value) {
if (is_array($value)) {
get_all_keys($value, $collector.$key.$separator);
}
else {
$filename = $collector.$key;
$content = $value;
// echo 'filename: '. $filename . PHP_EOL; //:debug
// echo 'content: ' . $content . PHP_EOL; //:debug
file_put_contents($filename, $content);
}
}
}
添加策略性放置的 echo 陳述句后,我能夠看到 $separator 變數在做什么。所以我將它重命名為 $collector,因為它正在收集密鑰以形成“所有密鑰”字串。我還將函式重命名為更具描述性,并將硬編碼的下劃線添加到名為 $separator 的新變數中。
由于我不需要創建新變數,因此我洗掉了 $carry 并直接在該else
部分中執行我需要完成的操作。
謝謝,盧卡斯!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/489414.html