Rumah > Soal Jawab > teks badan
Jika saya tahu laluan elemen dalam tatasusunan, bagaimanakah saya boleh mendapatkan nilai elemen ini?
Kod berikut melaporkan ralat, bagaimana untuk menyelesaikannya? Adakah sesiapa mempunyai idea yang baik?
$m = ['a'=>['b'=>['c'=>'@@@@@']]];
$x = 'a.b.c';
$y = str_replace('.','\'][\'',$x);
$y = 'm[\''.$y.'\']';
echo $$y;
Ralat akan dilaporkan:
Notis: Pembolehubah tidak ditentukan: m['a']['b']['c'] dalam /web/root/index.php pada baris 9
曾经蜡笔没有小新2017-05-16 13:11:31
Nama pembolehubah dinamik hanya sah untuk pembolehubah, bukan elemen tatasusunan 'm["a"]["b"]["c"]'
Walaupun $ ditambahkan di hadapan, keseluruhan rentetan akan dianggap sebagai pembolehubah, dan secara semula jadi ia tidak boleh ditemui.
Anda boleh menggunakan gelung
$m = ['a'=>['b'=>['c'=>'@@@@@']]];
$x = 'a.b.c';
$y = explode('.',$x);
$z = $m;
foreach ($y as $key => $value) {
$z = $z[$value];
}
var_dump($z);
我想大声告诉你2017-05-16 13:11:31
?Pertama sekali, pembolehubah $y selepas gema yang anda cetak mempunyai satu lagi $
符号,其次如果你想获取@@@@@
,直接$m['a']['b']['c']
迷茫2017-05-16 13:11:31
Sebenarnya, apa yang anda tulis adalah betul, jangan tergesa-gesa untuk bertanya, lihat sahaja kod anda
巴扎黑2017-05-16 13:11:31
Secara peribadi, saya berpendapat bahawa apabila menghadapi masalah seperti ini, kita harus mempertimbangkan untuk menggunakan rekursi untuk menanganinya dan bukannya menggunakan penggantian rentetan.
<?php
$data = [
'a'=>[
'b'=>[
'c'=>'@@@@@'
]
]
];
$path = 'a.b.c';
$arr = explode('.',$path);
function test($arr, $data){
if(array_key_exists($arr[0],$data)){
if(count($arr) > 1){
$key = array_shift($arr);
return test($arr, $data[$key]);
}else{
return $data[$arr[0]];
}
}else{
return null;
}
}
var_dump(test($arr,$data));
伊谢尔伦2017-05-16 13:11:31
$m = ['a'=>['b'=>['c'=>'@@@@@']]];
$x = 'a.b.c';
echo array_reduce(explode('.', $x), function($s, $i) { return $s[$i]; }, $m);
滿天的星座2017-05-16 13:11:31
Jika anda menggunakan rangka kerja laravel,
$m = [ 'a'=>['b'=>['c'=>'@@@@@' ]]];
$x = 'a.b.c';
$z = array_get($m,$x);
return $z;