2014-05-05 50 views
0

我用JSON和PHP得到關聯數組的值,而不使用密鑰名稱

試驗

我在JavaScript中創建(嵌套)的物體,像

var obj2={user:{name:"will"}, age:27, country:"UK"};

我把它轉化爲JSON和發送它通過AJAX/POST到PHP文件

hr.send("firstname="+JSON.stringify(obj2));

在那裏,我對其進行解碼,

$a=$_POST['firstname']; $b=json_decode($a,true);

所以它像Array ([user] => Array ([name] => will) [age] => 27 [country] => UK)

現在,如果我做

echo $b[user][name];

我會 「將」

如何我還可以得到相同的結果,但不知道密鑰的名稱?做一些像echo $b[0][0];,仍然輸出「意志」?

感謝

+1

您使用鍵名稱構造它,以便稍後通過鍵名訪問更容易。 '[user] [name]'對於大多數人來說意味着比[[0] [0]]更多。 – AbraCadaver

+0

[在PHP中通過整數索引訪問關聯數組](http://stackoverflow.com/questions/4769148/accessing-an-associative-array-by-integer-index-in-php) – adeneo

+0

@adeneo Is略有不同,因爲我的問題嵌套數組。 – slevin

回答

1

我不知道爲什麼你會想這樣做。 PHP中關聯數組的全部要點是很容易將這些索引「關聯」到它們的值。鍵名稱提示了該特定索引包含的內容。通過將數組轉換爲數字索引的數組,您將丟失信息。

如果這不是問題,您可以重新索引數組,以便能夠基於數字偏移量訪問數組值。使用array_values()重新索引數組,然後依據數字偏移訪問值(相對於鍵):

$array = array_values($b['user']); 
echo $array[0]; // => 'Will' 
+0

這是greate,但我怎麼能做到這一點,而不使用'用戶'鍵?像'$ array = array_values($ b [0]);'?謝謝 – slevin

+0

@slevin:肯定可能,但**爲什麼**你想這樣做? –

+0

不能通過設置'array_values($ b [0]);'來工作。沒有特別的原因。正如我所說的「我正在試驗JSON和PHP」。我想探索潛力。 – slevin

1

您可以使用array_keys的是,它返回與整數索引的所有密鑰的新數組

$keys = array_keys($b); 
$user = $b[$keys[0]]; 

$keys2 = array_keys($user); 
$name = $user[$keys2[0]]; // "will"; 
+0

您正將'$ b [$ keys [0]]'的值設置爲'will'。 OP想要檢索名稱,而不是存儲:「*我怎樣才能得到相同的結果,但不知道他的密鑰的名稱?*」。 –

+0

@AmalMurali - 沒關係,只是爲了展示價值是什麼,如果它看起來更好,我可以評論它。 – adeneo

+0

@adeneo這是greate,但我怎麼能做到這一點,而不使用'用戶'鍵?像'$ keys = array_keys($ b [0]);'謝謝 – slevin

1

你的意思是?

$b = array('user' => array ('name' => 'will'), 'age' => 27); 

echo current(current($b)); // 'will' 

這假定內部「數組指針」沒有被前移動。詳情請參閱current

更靈活的將是拾取第n個元件的功能:

$b = array('user' => array ('name' => 'will' , 'lastname' => 'smith'), 'age' => 27); 
print nth(nth($b, 0), 1); // smith 
+0

非常有趣。有用。你的方法需要幾行,但不靈活,因爲如果我的數組像'var obj2 = {user:{name:「will」,lastname:「smith」},年齡:27,country:「UK」};'I找不到打印'smith'的方法。 adeneo的方法需要更多的線,但是很靈活,因爲我可以替換'$ name = $ user [$ keys2 [1]];'並且獲得「smith」。總之,這些只是實驗,所以非常感謝 – slevin

+0

@slevin:請參閱編輯 – georg

+0

我認爲你必須替換'return array_values($ ary [$ position]);'我測試了幾次,改變它並且不起作用。我沒有得到回聲,但也沒有在控制檯中的錯誤。奇怪的 – slevin

0

,則不應通過JSON或通過關聯數組去:

function nth($ary, $position) { 
    return array_values($ary)[$position]; 
} 

實施例。理論上關聯數組並不保證順序將被保留。

如果您可以假定每個對象的字段名的標準順序,此方法將非常有用。

創建將在發送和接收時使用的字段名的標準列表。

$objectsTypes = array('user','task') 
$fieldsUser = array('firstname','lastname','age'); 

然後按照正確的順序發送數據。例如,使用GET(POST也可以相同的方式工作):

?data[0][0]=Maxwell&data[0][1]=Smart&data[0][2]=35&data[1]=AnswerShoePhone 

當處理你知道該期待每個變量哪個位置的數據。你可以硬編碼位置,或動態檢測它們。

echo $_GET['data'][0][0];//Maxwell 
echo $_GET['data'][0][1];//Smart 
echo $_GET['data'][1];//AnswerShoePhone 

$indexOfUser = array_search('user',$objectsTypes); 
$indexOfLastname = array_search('lastname',$fieldsUser); 
echo $_GET['data'][ $indexOfUser ][ $indexOfLastname ];//Smart 

如果您希望支持對象集合(例如多個用戶),您可以將所有對象集中在一個更深層次。例如

?data[0][0][0]=Maxwell 
&data[0][0][1]=Smart 
&data[0][1][0]=Agent 
&data[0][1][1]=99 

$users = $_GET['data'][ $indexOfUser ] 
相關問題