我有一个字符串,其中有一些带方括号的变量名,例如:
$str = '[key][subkey][otherkey]';
我需要创建一个多维数组,其中包含与字符串中表示的相同键(
$value
只是一个无关紧要的字符串值):$arr = [ 'key' => [ 'subkey' => [ 'otherkey' => $value ] ] ];
或者如果您喜欢另一种符号表示法:
$arr['key']['subkey']['otherkey'] = $value;
理想情况下,我希望像字符串一样添加数组键,但据我所知这是不可能的。我认为array_push()
在这里不能起到作用。起初我以为我可以使用正则表达式从字符串中获取方括号中的数值:
preg_match_all( '/\[([^\]]*)\]/', $str, $has_keys, PREG_PATTERN_ORDER );
但是我只有一个没有任何层次结构的非关联数组,对我来说没有用。
因此,我想到了以下解决方案:
$str = '[key][subkey][otherkey]';
$value = 'my_value';
$arr = [];
preg_match_all( '/\[([^\]]*)\]/', $str, $has_keys, PREG_PATTERN_ORDER );
if ( isset( $has_keys[1] ) ) {
$keys = $has_keys[1];
$k = count( $keys );
if ( $k > 1 ) {
for ( $i=0; $i<$k-1; $i++ ) {
$arr[$keys[$i]] = walk_keys( $keys, $i+1, $value );
}
} else {
$arr[$keys[0]] = $value;
}
$arr = array_slice( $arr, 0, 1 );
}
var_dump($arr);
function walk_keys( $keys, $i, $value ) {
$a = '';
if ( isset( $keys[$i+1] ) ) {
$a[$keys[$i]] = walk_keys( $keys, $i+1, $value );
} else {
$a[$keys[$i]] = $value;
}
return $a;
}
现在,这个“works”(即使字符串的 "keys" 数量不同)但在我看来它看起来很丑陋和过于复杂。有更好的方法来做到这一点吗?
[key1][subkey1][otherkey1] bla bla [key2][subkey2][otherkey2]
? - HamZa