У меня есть эта строка: test1__test2__test3__test4__test5__test6=value
test1__test2__test3__test4__test5__test6=value
Может быть любое количество тест-ключей.
Я хочу написать функцию, которая может превратить приведенную выше строку в массив
$data[test1][test2][test3][test4][test5][test6] = "value";
Возможно ли это?
function special_explode($string) { $keyval = explode('=', $string); $keys = explode('__', $keyval[0]); $result = array(); //$last is a reference to the latest inserted element $last =& $result; foreach($keys as $k) { $last[$k] = array(); //Move $last $last =& $last[$k]; } //Set value $last = $keyval[1]; return $result; } //Test code: $string = 'test1__test2__test3__test4__test5__test6=value'; print_r(special_explode($string));
Да, это возможно:
list($keys, $value) = explode('=', $str); $keys = explode('__', $keys); $t = &$data; $last = array_pop($keys); foreach($keys as $key) { if(!isset($t[$key]) || !is_array($t[$key])) { // will override non array values if present $t[$key] = array(); } $t = &$t[$key]; } $t[$last] = $value;
ДЕМО
Ссылка : list, explode, =&, is_array, array_pop
list
explode
=&
is_array
array_pop
$data = array(); // Supposing you have multiple strings to analyse... foreach ($strings as $string) { // Split at '=' to separate key and value parts. list($key, $value) = explode("=", $string); // Current storage destination is the root data array. $current =& $data; // Split by '__' and remove the last part $parts = explode("__", $key); $last_part = array_pop($parts); // Create nested arrays for each remaining part. foreach ($parts as $part) { if (!array_key_exists($part, $current) || !is_array($current[$part])) { $current[$part] = array(); } $current =& $current[$part]; } // $current is now the deepest array ($data['test1']['test2'][...]['test5']). // Assign the value to his array, using the last part ('test6') as key. $current[$last_part] = $value; }
$str = ...; eval( str_replace('__', '][', preg_replace('/^(.*)=(.*)$/', '\$data[$1]=\'$2\';', $str)) );
более простой способ, предполагая, что $str является надежными данными
$str
Полагаю, это ...
$string = "test1__test2__test3__test4__test5__test6=value"; $values = explode('=',$string); $indexes = explode('__',$values[0]); $data[$indexes[0]][$indexes[1]][$indexes[2]][$indexes[3]][$indexes[4]][$indexes[5]] = $values[1];