[英]PHP String to multidimensional array
假設我的變量中包含以下字符串:
$arr['data_|_multilanguage_|_en_|_field'] = 23;
我想將其轉換為多維數組,如下所示:
$arr['data']['multilanguage']['en']['field'] = 23;
我做了一個遞歸函數
foreach ($arr as $outer_key => $outer_value) {
$parts = explode('_|_', $outer_key);
$reference =& $arr;
$final_key = count($parts) - 1;
foreach ($parts as $key => $part) {
if (!$final_key == $key) {
if (empty($reference[$part])) {
$reference[$part] = array();
}
$reference =& $reference[$part];
} else {
$reference[$part] = $arr[$str];
unset($arr[$outer_key]);
}
}
}
問題是var_dump
顯示子項是引用。 有沒有更好的辦法?
你只有一個錯誤的if()
語句:
if (!$final_key == $key) {}
!
將在 ==
之前進行評估。
將其更改為:
if ($final_key != $key) {}
(你在最后的$reference[$part] =
賦值中有另一個小問題,我在下面的代碼中糾正了它)
$arr['data_|_multilanguage_|_en_|_field'] = 23;
foreach ($arr as $outer_key => $outer_value) {
$parts = explode('_|_', $outer_key);
$reference =& $arr;
$final_key = count($parts) - 1;
foreach ($parts as $key => $part) {
if ($final_key != $key) {
if (empty($reference[$part])) {
$reference[$part] = array();
}
$reference =& $reference[$part];
} else {
$reference[$part] = $outer_value;
unset($arr[$outer_key]);
}
}
}
這是你的結果!
array(1) {
["data"]=>
array(1) {
["multilanguage"]=>
array(1) {
["en"]=>
&array(1) {
["field"]=>
int(23)
}
}
}
}
這應該工作我認為,傳入你的(現有)數組,想要的密鑰(為什么不使用點符號而不是'_ | _'?),以及你想要的值
function array_set(&$array, $key, $value)
{
if (is_null($key)) return $array = $value;
$keys = explode('_|_', $key);
while (count($keys) > 1)
{
$key = array_shift($keys);
// If the key doesn't exist at this depth, we will just create an empty array
// to hold the next value, allowing us to create the arrays to hold final
// values at the correct depth. Then we'll keep digging into the array.
if ( ! isset($array[$key]) || ! is_array($array[$key]))
{
$array[$key] = array();
}
$array =& $array[$key];
}
$array[array_shift($keys)] = $value;
return $array;
}
<?php
$arr = array();
$arr['data_|_multilanguage_|_en_|_field'] = 23;
$arr['data_|_multilanguage_|_en_|_field2'] = 32;
$arr['data_|_multilanguage_|_fr_|_field'] = 57;
$arr['data_|_test'] = 57;
$arr['data_|_testing_|_var'] = 57;
function doArray(&$newarr,$keys,$value) {
if(count($keys) > 1) {
$key = array_shift($keys);
if(!isset($newarr[$key]) || !is_array($newarr[$key])) {
$newarr[$key] = array();
}
doArray($newarr[$key],$keys,$value);
} else {
$newarr[array_shift($keys)] = $value;
}
}
$newarr = array();
foreach($arr AS $key => $value) {
$keys = explode("_|_",$key);
doArray($newarr,$keys,$value);
}
echo '<pre>';
print_r($newarr);
echo '</pre>';
?>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.