比如現在我有變數 $arr, 他是一個陣列
<code>$arr = [ 'news' => [ 'data' => [ 0 => [ 'title' => '名字', 'content' => '内容' ], ], ], ]; </code>
一些框架或模板引擎 都帶了解析的功能, 可以通過 arr.news.data[0].title
的方式, 獲取到 title
的值, 以及可以對值進行修改。
那麼我想知道他是什麼原理, 如何 高效、安全、簡單 的使用此種表達方式對數組中的值進行獲取
以及設置
呢?
我能想到的是利用文字處理的方式實現的, 不過安全性、效率上應該不算很高。請老師指點。
比如現在我有變數 $arr, 他是一個陣列
<code>$arr = [ 'news' => [ 'data' => [ 0 => [ 'title' => '名字', 'content' => '内容' ], ], ], ]; </code>
一些框架或模板引擎 都帶了解析的功能, 可以通過 arr.news.data[0].title
的方式, 獲取到 title
的值, 以及可以對值進行修改。
那麼我想知道他是什麼原理, 如何 高效、安全、簡單 的使用此種表達方式對數組中的值進行獲取
以及設置
呢?
我能想到的是利用文字處理的方式實現的, 不過安全性、效率上應該不算很高。請老師指點。
絕大多數模板引擎都是使用預先編譯的方式處理的,即輸入的模板數據,會將其中變數、循環、條件等符號,轉換成標準的PHP語句,之後再執行這些內容。
另外,這些框架或是模板引擎都是開源的,你有時間在這裡問人,自己去看看程式碼早就明白了。
我幫你找代碼好吧。
<code> public static function getValue($array, $key, $default = null) { if ($key instanceof \Closure) { return $key($array, $default); } if (is_array($key)) { $lastKey = array_pop($key); foreach ($key as $keyPart) { $array = static::getValue($array, $keyPart); } $key = $lastKey; } if (is_array($array) && (isset($array[$key]) || array_key_exists($key, $array)) ) { return $array[$key]; } if (($pos = strrpos($key, '.')) !== false) { $array = static::getValue($array, substr($key, 0, $pos), $default); $key = substr($key, $pos + 1); } if (is_object($array)) { // this is expected to fail if the property does not exist, or __get() is not implemented // it is not reliably possible to check whether a property is accessable beforehand return $array->$key; } elseif (is_array($array)) { return (isset($array[$key]) || array_key_exists($key, $array)) ? $array[$key] : $default; } else { return $default; } }</code>