Я пытаюсь преобразовать ключевые значения массива в многомерный массив. Ключевые значения выглядят многомерными, но являются просто текстовыми. Я попытался взломать строку и создать новый массив, но я чувствую, что должно быть что-то более простое, чем просто это.
Пример ниже:
Array ( [Template[URL]] => http://www.asdasdda.com [Template[UPC]] => 5484548546314 [Field[value]] => Test Example [Field[answer]] => 20 )
Вся помощь очень удобна. 🙂
UPDATE: это точный вывод данных, прежде чем запускать json_decode на данные.
{"Template[URL]":"http://www.asdasdda.com","Template[UPC]":"5484548546314","Field[value]":"Test Example","Field[answer]":"20"}
Немного покрутился, и я думаю, что понял. Я не думаю, что есть более простой способ:
foreach ($array as $key=>$value) { preg_match("/\[(.+)\]/",$key,$match); $newKey = preg_replace("/\[.+\]/","",$key); $newArray[$newKey][$match[1]] = $value; }
Где print_r()
из $newArray
выглядит следующим образом:
Array ( [Template] => Array ( [URL] => http://www.asdasdda.com [UPC] => 5484548546314 ) [Field] => Array ( [value] => Test Example [answer] => 20 ) )
Вероятно, проблема должна быть решена там, где создается массив. Если у вас нет доступа к этому, вы можете использовать регулярное выражение с эталонным циклом для преобразования массива:
$array = [ "Template[URL]" => 'http://www.asdasdda.com', "Template[UPC]" => '5484548546314', "Multi[Level][Array]" => 'Hello World' ]; function convert(&$array, $key, $value) { preg_match_all("/(?=^)[^]]+(?=\[)|(?<=\[)[^]]+(?=\])/", $key, $keys); if ($keys = $keys[0]) { // Unset original key unset($array[$key]); // Dig into each level of keys and reassign the reference foreach($keys as $key) { if (!isset($array[$key])) $array[$key] = null; $array = &$array[$key]; } // Set the final level equal to the original value $array = $value; } } foreach($array as $key=>$value) { convert($array, $key, $value); } print_r($array);
с$array = [ "Template[URL]" => 'http://www.asdasdda.com', "Template[UPC]" => '5484548546314', "Multi[Level][Array]" => 'Hello World' ]; function convert(&$array, $key, $value) { preg_match_all("/(?=^)[^]]+(?=\[)|(?<=\[)[^]]+(?=\])/", $key, $keys); if ($keys = $keys[0]) { // Unset original key unset($array[$key]); // Dig into each level of keys and reassign the reference foreach($keys as $key) { if (!isset($array[$key])) $array[$key] = null; $array = &$array[$key]; } // Set the final level equal to the original value $array = $value; } } foreach($array as $key=>$value) { convert($array, $key, $value); } print_r($array);
Выходы:
Array ( [Template] => Array ( [URL] => http://www.asdasdda.com [UPC] => 5484548546314 ) [Multi] => Array ( [Level] => Array ( [Array] => Hello World ) ) )
Ссылки используются, чтобы вы могли выкапывать на несколько уровней, если вам нужно.