[英]get value of associative array without using the key name
我正在嘗試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];
仍然輸出“將”?
謝謝
我不確定為什么要這么做。 PHP中關聯數組的全部目的是輕松地將索引“關聯”到它們的值。 鍵名提示了該特定索引所包含的內容。 通過將數組轉換為數字索引的數組,您將丟失信息。
如果這不是問題,則可以先重新索引數組,以便能夠基於其數值偏移量訪問數組值。 使用array_values()
重新索引數組,然后基於數字偏移量(而不是鍵)訪問值:
$array = array_values($b['user']);
echo $array[0]; // => 'Will'
您可以使用array_keys
,它返回一個新數組,其中所有鍵都由整數索引
$keys = array_keys($b);
$user = $b[$keys[0]];
$keys2 = array_keys($user);
$name = $user[$keys2[0]]; // "will";
你是這個意思嗎
$b = array( 'user' => array ( 'name' => 'will' ), 'age' => 27);
echo current(current($b)); // 'will'
假定內部“數組指針”之前沒有移動過。 有關詳細信息,請參見current
內容。
一個更靈活的函數是選擇第n個元素的函數:
function nth($ary, $position) {
return array_values($ary)[$position];
}
例:
$b = array( 'user' => array ( 'name' => 'will' , 'lastname' => 'smith'), 'age' => 27);
print nth(nth($b, 0), 1); // smith
您不應該通過JSON或關聯數組。 理論上,關聯數組不能保證順序會被保留。
僅當您可以為每個對象假設標准的字段名稱順序時,此方法才有用。
創建發送和接收時將使用的標准字段名稱列表。
$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 ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.