我有了一子陣列我可以訪問通過如何使用變量作爲多維關聯數組鍵?
$fund['ManagersSets'][0]['PortfolioDate'];
我想用一個字符串變量數組鍵的數組。就像:
$key = "'ManagersSets'][0]['ManagerBreakdowns'";
print_r($fund[$key]);
但是,當我運行它時,得到一個未定義的索引通知。有沒有辦法做到這一點?
我有了一子陣列我可以訪問通過如何使用變量作爲多維關聯數組鍵?
$fund['ManagersSets'][0]['PortfolioDate'];
我想用一個字符串變量數組鍵的數組。就像:
$key = "'ManagersSets'][0]['ManagerBreakdowns'";
print_r($fund[$key]);
但是,當我運行它時,得到一個未定義的索引通知。有沒有辦法做到這一點?
它是否必須是一個字符串?你可以這樣做:
$key = array('ManagerSets', 0, 'ManagerBreakdowns');
$result = $fund;
foreach($key as $index)
$result = $result[$index];
print_r($result);
這看起來相當古怪,並不是很安全,但如果你必須這樣做,你可以。
如果您確實需要字符串,可以使用explode
或preg_split
輕鬆將其轉換爲數組。
再次我不建議您使用這個。以不同方式排列數據可能會更好。
爲什麼它不安全? – Script47
如果輸入是字符串,它可以被分解爲像你的數組 – Andreas
那麼,如果該數組沒有這些索引,那麼你將有空元素,可能是一個錯誤。我想,如果你寫'$ fund ['ManagerSets'] [0] ['ManagerBreakdowns']',但同樣的事情會發生,但你可以更容易地檢查第二個 – SourceOverflow
隨着你的線路print_r($fund[$key]);
你從PHP詢問的是訪問陣列基金中不存在的密鑰'ManagersSets'][0]['ManagerBreakdowns'
。有一個密鑰ManagersSets
但沒有密鑰'ManagersSets'][0]['ManagerBreakdowns'
你不能讓PHP從一個指令中訪問一個變量序列的索引,就像這樣。
你可以做什麼,但你如果你想達到類似的東西在呼喚eval()
這樣不應該做:
$fund = ['ManagersSets' => [['PortfolioDate' => "2017-09-26"]]];
$fund['ManagersSets'][0]['ManagerBreakdowns'] = [1, 2, 3];
$key = "'ManagersSets'][0]['ManagerBreakdowns'";
print_r(eval('return $fund[' . $key. '];'));
上面的代碼將打印
Array
(
[0] => 1
[1] => 2
[2] => 3
)
但你不應該這樣做的原因是,如果$key
變量內的值依賴於用戶輸入,如果有人設法將惡意它裏面的代碼,它會按原樣執行。
例如,如果
$key = "'ManagersSets'] &&
file_put_contents('/tmp/test', 'Oops!') ||
\$fund['ManagersSets'";
試圖做print_r(eval('return $fund[' . $key. '];'));
會導致打印1
和寫作 「糟糕!」在/tmp/test
。這只是一個小例子,我讓你想象黑客可以用這樣的力量做什麼。
只需使用三個指標變量:
list($ix_set, $ix_num, $ix_field) = ['ManagersSets', 0, 'PortfolioDate'];
$value = $fund[$ix_set][$ix_num][$ix_field];
這不是很動態。我認爲OP正在尋找可以適用於多種情況的東西 – Andreas
我很高興,事實並非如此,因爲太多的活力可能會讓屁股感到痛苦 –
不,你不能這樣做 –
[您可以](https://3v4l.org/uf4WU) - 它只是不理想:)。 – ishegg
以上兩點意見都是正確的。你*不能*做到這一點,因爲它可能*有多危險,但同時你*可以*但你*不應該*,這隻取決於你是如何願意生活在邊緣和*做*你*不應該做的,以達到你想要做的事。 – Script47