在不使用键名的情况下获取关联数组的值

时间:2014-05-05 17:35:42

标签: javascript php arrays json

我正在尝试使用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];之类的事情仍然输出"将"?

由于

4 个答案:

答案 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 ]