2017-09-26 151 views
-2

我有了一子陣列我可以訪問通過如何使用變量作爲多維關聯數組鍵?

$fund['ManagersSets'][0]['PortfolioDate']; 

我想用一個字符串變量數組鍵的數組。就像:

$key = "'ManagersSets'][0]['ManagerBreakdowns'"; 
print_r($fund[$key]); 

但是,當我運行它時,得到一個未定義的索引通知。有沒有辦法做到這一點?

+3

不,你不能這樣做 –

+1

[您可以](https://3v4l.org/uf4WU) - 它只是不理想:)。 – ishegg

+0

以上兩點意見都是正確的。你*不能*做到這一點,因爲它可能*有多危險,但同時你*可以*但你*不應該*,這隻取決於你是如何願意生活在邊緣和*做*你*不應該做的,以達到你想要做的事。 – Script47

回答

3

它是否必須是一個字符串?你可以這樣做:

$key = array('ManagerSets', 0, 'ManagerBreakdowns'); 
$result = $fund; 
foreach($key as $index) 
    $result = $result[$index]; 
print_r($result); 

這看起來相當古怪,並不是很安全,但如果你必須這樣做,你可以。

如果您確實需要字符串,可以使用explodepreg_split輕鬆將其轉換爲數組。

再次我不建議您使用這個。以不同方式排列數據可能會更好。

+0

爲什麼它不安全? – Script47

+0

如果輸入是字符串,它可以被分解爲像你的數組 – Andreas

+0

那麼,如果該數組沒有這些索引,那麼你將有空元素,可能是一個錯誤。我想,如果你寫'$ fund ['ManagerSets'] [0] ['ManagerBreakdowns']',但同樣的事情會發生,但你可以更容易地檢查第二個 – SourceOverflow

0

隨着你的線路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。這只是一個小例子,我讓你想象黑客可以用這樣的力量做什麼。

1

只需使用三個指標變量:

list($ix_set, $ix_num, $ix_field) = ['ManagersSets', 0, 'PortfolioDate']; 
$value = $fund[$ix_set][$ix_num][$ix_field]; 
+0

這不是很動態。我認爲OP正在尋找可以適用於多種情況的東西 – Andreas

+0

我很高興,事實並非如此,因爲太多的活力可能會讓屁股感到痛苦 –