2012-07-17 15 views
27

我有一個PHP數組,它具有數字鍵作爲字符串類型。帶數字鍵作爲字符串的PHP數組無法使用

但是當我嘗試訪問它們時,PHP給了我一個未定義的索引錯誤。

$a = (array)json_decode('{"1":1,"2":2}'); 
var_dump($a); 
var_dump(isset($a[1])); 
var_dump(isset($a["1"])); 
var_dump($a[1]); 
var_dump($a["1"]); 

輸出:

 
array (size=2) 
    '1' => int 1 
    '2' => int 2 

boolean false 

boolean false 

ERROR: E_NOTICE: Undefined offset: 1 

null 

ERROR: E_NOTICE: Undefined offset: 1 

null 

如何訪問這些價值?

演示:http://codepad.viper-7.com/8O03IM

+1

給聲譽+100之前它已過期。 – 2012-09-10 14:47:14

+8

@JosuaMarcelChrisano:在賞金到期前有整整6天的時間。賞金昨天剛剛開始。給他休息一下。 6天后你也沒有必要再提醒他 - 系統會這樣做。 – BoltClock 2012-09-10 21:08:02

回答

27

所以,我還沒有看到任何其他答案涉及到這一點,但@xdazz接近。

讓我們開始我們的環境,$obj等於解碼的字符串的對象符號:

php > $obj = json_decode('{"1":1,"2":2}'); 

php > print_r($obj); 
stdClass Object 
(
    [1] => 1 
    [2] => 2 
) 

php > var_dump($obj); 
object(stdClass)#1 (2) { 
    ["1"]=> 
    int(1) 
    ["2"]=> 
    int(2) 
} 

如果您要訪問的字符串,我們知道下面會失敗:

php > echo $obj->1; 

Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `'{'' or `'$'' in php shell code on line 1 

訪問對象變量

您可以像這樣訪問它:

php > echo $obj->{1}; 
1 

這是說同樣的:

php > echo $obj->{'1'}; 
1 

訪問數組變量

問題與陣列是以下返回空,這是類型轉換的問題。

php > echo $obj[1]; 
php > 

如果強制轉換回來,目的是再次訪問:

php > $obj = (object) $obj; 
php > echo $obj->{1}; 
1 

這裏是一個將自動上面給你一個函數:

function array_key($array, $key){ 
    $obj = (object) $array; 
    return $obj->{$key}; 
} 

用法示例:

php > $obj = (array) $obj; 
php > echo array_key($obj, 1); 
1 

php > echo array_key($obj, 2); 
2 
+1

很好的回答.... – Petah 2012-09-13 01:56:36

25

如果你想陣列的json_decode第二個參數設置爲true

$a = json_decode('{"1":1,"2":2}', true); 

編輯: 當你施放一個std對象數組,字符串,數字鍵不轉換爲數字。 這裏是一個例子。

$obj = new stdClass; 
$obj->{'1'} = 1; 
$arr = (array) $obj; 
var_dump($arr); 
var_dump(isset($arr[1])); 
+0

謝謝,這適用於我的問題。獎勵點,如果你可以找到一種方式訪問​​一個數組與這些類型的鍵雖然。 – Petah 2012-07-17 03:23:42

+4

@Petah這是php的問題,但你仍然可以通過'foreach'獲得關鍵和價值。 – xdazz 2012-07-17 03:36:42

14

顯然,這是一個已知問題,目前還沒有計劃解決它;請參閱Doc Bug #45959 Object to array conversion leads to weird behaviour

修復意味着性能下降,因此更好似乎將其保留爲已知問題,但記錄在案。

這wonkiness是(然後)在documentation for the array type(重點煤礦)指出:

如果對象被轉換成一個陣列,其結果是一個數組,其元素爲對象的屬性。鍵是成員變量名,有幾個明顯的例外:整數屬性是不可訪問 ....這可能會導致一些意外的行爲....

+1

好的答案!我不得不說,轉換爲數組已經足夠破壞了,可以聲明一個新規則:永遠不會向PHP中的任何數組投射任何東西。 – 2012-09-10 07:17:36

1

是的。我同意,PHP從對象到數組的類型轉換有問題,但是foreach智能地處理對象或關聯數組。

$a = json_decode('{"1":1,"2":2}'); //need not typecast but doesnt break even if u typecast 

foreach ($a as $k=>$v){ 
    echo $v; 
} 
1

我最近遇到了同樣的問題。

$obj = new stdClass(); 
$obj->{'0'} = "test"; 

$array = (array)$obj; 
foreach ($array as $key => $value) { 
    $array[$key] = strtoupper($value); 
} 
var_dump($array); 

該代碼輸出:

array(2) { 
    ["0"]=> 
    string(4) "test" 
    [0]=> 
    string(4) "TEST" 
} 

研究發現,調試到recursivly對象轉換爲陣列的方法的情況下,我已經狂。

1

我有同樣的問題(但與array_intersect_key)。

這裏是我的解決方案:

$array = array_combine(array_keys($array), $array);