我做了一個話題關於設法以前使用數組索引作爲變量名,並獲得我感興趣here一個答案。評估和數組索引作爲變量
答案之一建議使用eval(),雖然沒有推薦,由於其潛在的安全問題。
$string = 'welcome["hello"]';
eval('$' . $string . " = 'thisworks';");
// This also works : eval("$$string = 'thisworks';");
// I could then print the array keys value like this
print($welcome["hello"]); // Prints 'thisworks'
但是,這種解決方案是最簡單的,並且可能是我想要實現的最合適的解決方案。我實際上在一個WordPress的管理面板上工作,用戶可以設置各種選項。每個選項是通過含有一個多維陣列中,這樣的(僅大得多)的變量設定:
$options = array(
array(
'id' => 'option_id', // The name of the input field
'type' => 'text', // Input type
'value' => 'some value here' // Input value
)
);
當用戶保存的選項,功能火災,創建一個數組出所有的各種輸入值的並將它們保存到數據庫中。像下面,雖然高度剝離下來:
foreach ($options as $o) {
if (isset($_POST[ $o[ 'id' ] ])) {
$settings[ $o[ 'id' ] ] = $_POST[ $o[ 'id' ] ];
}
}
一些從多層面選擇變量的選項,將被保存爲一個陣列的一部分,而不是字符串。這些選項在其ID中包含方括號,如'option_id [value1]'。
這就是事情變得複雜。目前,我不得不通過檢查方括號[]的函數發送ID,然後告訴save函數如何處理它(保存爲數組或字符串)。
這就是爲什麼EVAL解決方案是理想的。它允許我創建一個已經是數組並且包含索引的變量,而不必使用其他函數來檢測該ID。這嚴重減少了漫長的過程,或者我相信。
所以在本質上,是有一個更安全,類似的方法可以讓我去使用eval,或者使用替代功能。以上述方式使用eval有什麼危險?惡意代碼可以在上面使用的上下文中執行嗎?在$之前肯定執行代碼會導致PHP錯誤?
在評估'eval'的潛在危險時注意字符串的來源是很重要的。由於字符串是用戶生成的(你沒有100%的控制權),eval是不可能的。 –
我最近碰到這個問題,試圖通過閱讀'php:// input'解析括號的關鍵字來修復'$ _POST'數據,這樣我就可以創建數組(PHP會做一些[奇怪的事情]( http://www.php.net/manual/en/language.variables.external.php#81080)到某些輸入鍵)。 –
你應該詳細說明整個「將一些保存爲一個數組,另存爲一個字符串的東西」。目前還不清楚你在做什麼。充分豐富實例。 – goat