我正在尝试使用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];
之类的事情仍然输出"将"?
由于
答案 0 :(得分:1)
我不确定你为什么要这样做。 PHP中关联数组的重点是轻松地将索引“关联”到它们的值。键名称提示了特定索引包含的内容。通过将数组转换为数字索引数组,您将丢失信息。
如果这不是问题,您可以先重新索引数组,以便能够根据数字偏移量访问数组值。使用array_values()
重新索引数组,然后根据数字偏移(而不是键)访问值:
$array = array_values($b['user']);
echo $array[0]; // => 'Will'
答案 1 :(得分:1)
你可以使用array_keys
,它返回一个新数组,其中所有键都用整数索引
$keys = array_keys($b);
$user = $b[$keys[0]];
$keys2 = array_keys($user);
$name = $user[$keys2[0]]; // "will";
答案 2 :(得分:1)
你是说这个吗?
$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
答案 3 :(得分:0)
您不应该通过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
如果您想支持一组对象(例如多个用户),您可以将所有内容嵌套到更深层。 e.g。
?data[0][0][0]=Maxwell
&data[0][0][1]=Smart
&data[0][1][0]=Agent
&data[0][1][1]=99
$users = $_GET['data'][ $indexOfUser ]