php:试图找到相当于的地图

时间:2012-06-01 22:36:22

标签: php arrays object

我正在努力构建一个对象对象,而不是一个对象数组(这样可以工作,但以后用json不太容易使用)

使用http://writecodeonline.com/php/进行测试

$a = Array();
$obj = new stdClass();
$obj->key = "name";
$obj->value = "durant";
array_push($a, $obj);

$obj = new stdClass();
$obj->key = "friend";
$obj->value = "johns";
array_push($a, $obj);

$preds = Array();
foreach( $a as $v ){
$item = Array(); // new stdClass(); 
$item[$v->key] = $v->value; // ^  doesn't work
array_push($preds, $item);
}
$obj = new stdClass();
$obj->key = "data";
$obj->value = $preds;
array_push($a, $obj);

//var_dump($a);

echo(json_encode($a[2]->value));  // returns: [{"name":"durant"},{"friend":"johns"}]

我希望能够轻松执行$ arr ['name']或$ arr ['friend']

编辑:就像那样(感谢Dani):我对Php来说完全没有人,所以如果有人可以解释(JSON_FORCE_OBJECT选择没有解决它)

$a = Array();
$obj = new stdClass();
$obj->key = "name";
$obj->value = "durant";
array_push($a, $obj);

$obj = new stdClass();
$obj->key = "friend";
$obj->value = "johns";
array_push($a, $obj);

$preds = new stdClass();
foreach( $a as $v ){
$k = $v->key;
$preds->$k = $v->value;
}
$obj = new stdClass();
$obj->key = "data";
$obj->value = $preds;
array_push($a, $obj);

echo(json_encode($a[2]->value)); // returns: {"name":"durant", "friend":"johns"}

4 个答案:

答案 0 :(得分:0)

这并没有回答你的问题,但你想要完成的事情可以通过简单的PHP(关联)数组完成,你可以将它与Ruby的哈希或JavaScript进行比较。对象:

$myArray = array('foo' => 'bar');

或者,在PHP 5.4语法中:

$myArray = ['foo' => 'bar']

此外,正如其他人所说,{{"tob":"durant"},{"caty":"johns"}}不是一个有效的对象,因为它没有密钥。

答案 1 :(得分:0)

您可以将关联数组转换为对象,因此如果您想要快速简单的对象初始化,您可以使用数组语法然后转换它:

$var = (object) array(
    'dit'=>'dat',
    'foo'=>'bar',
);

{{"tob":"durant"},{"caty":"johns"}}是无效的JavaScript,所以我猜你想要什么。{0:{"tob":"durant"},1:{"caty":"johns"}}是你将普通数组转换为对象时会得到的。)

答案 2 :(得分:0)

转换为JSON时,关联数组(至少包含1个字符串键的数组)将始终转换为JSON对象。

当转换空或数组而没有字符串键(数字键)时,数组将始终转换为JSON数组[]。

为了确保空数组或数值数组太过转换为对象,在将它们作为参数传递时将它们与(对象)一起转换。

如果你有嵌套数组,那么将标志传递给json_encode要容易得多: json_encode($arrNestedArraysAndObjects, JSON_FORCE_OBJECT); (你需要> PHP 5.3,已经多年了)

答案 3 :(得分:0)

您可以使用变量:

$name = 'bar';
$foo->$name = 123; 
// same as:
$foo->bar = 123;