您可以使用一個遞歸函數(或者因爲它的尾遞歸的迭代當量):
function return_value($array, $input_string) {
$segments = explode(':',$input_string);
// Can we go next step?
if (!array_key_exists($segments[0], $array)) {
return false; // cannot exist
}
// Yes, do so.
$nextlevel = $array[$segments[0]];
if (!is_array($nextlevel)) {
if (1 == count($segments)) {
// Found!
return $nextlevel;
}
// We can return $nextlevel, which is an array. Or an error.
return false;
}
array_shift($segments);
$nextsegments = implode(':', $segments);
// We can also use tail recursion here, enclosing the whole kit and kaboodle
// into a loop until $segments is empty.
return return_value($nextlevel, $nextsegments);
}
傳遞一個對象
比方說,我們希望這是一個API,僅通過一個字符串(請記住,HTTP在這方面有一些方法限制,並且您可能需要POST字符串而不是GET)。
的字符串將需要包含都數組數據和「鑰匙」的位置。這是最好的,如果我們先發送鍵,然後數組:
function decodeJSONblob($input) {
// Step 1: extract the key address. We do this is a dirty way,
// exploiting the fact that a serialized array starts with
// a:<NUMBEROFITEMS>:{ and there will be no "{" in the key address.
$n = strpos($input, ':{');
$items = explode(':', substr($input, 0, $n));
// The last two items of $items will be "a" and "NUMBEROFITEMS"
$ni = array_pop($items);
if ("a" != ($a = array_pop($items))) {
die("Something strange at offset $n, expecting 'a', found {$a}");
}
$array = unserialize("a:{$ni}:".substr($input, $n+1));
while (!empty($items)) {
$key = array_shift($items);
if (!array_key_exists($key, $array)) {
// there is not this item in the array.
}
if (!is_array($array[$key])) {
// Error.
}
$array = $array[$key];
}
return $array;
}
$arr = array(
0 => array(
'hello' => array(
'joe','jack',
array('jill')
)));
print decodeJSONblob("0:hello:1:" . serialize($arr));
print decodeJSONblob("0:hello:2:0" . serialize($arr));
回報
jack
jill
同時要求0:hello:2:
會讓你的數組{ 0: 'jill' }
。
這聽起來像是一個[XY問題](HTTP://meta.stackexchange .COM /問題/ 66377 /什麼,是最XY-問題)。爲什麼不能使用'serialize'或'json_encode'? – h2ooooooo
我正在嘗試構建一個全局可用的靜態配置類,我可以通過使用類似於'config :: get('db:server')的語法檢索值' – Marc