在用于返回JSON的 php 中创建对象时,是否可以添加属性并强制它在顶部?我喜欢这个,因为对象是通过API公开的,所以最好将ID放在顶部。
例如:
$obj = new stdClass();
$obj->name = 'John';
$obj->age = 26;
$obj->id = 3645;
当你json_encode()
时,它会变成:
{
"name": "John",
"age": 26,
"id": 3645
}
有没有办法强制id
在对象的顶部,即使它最后添加?请注意,由于其他相关代码,我无法在添加id
和name
之前添加age
。
答案 0 :(得分:2)
如果你使用一个关联数组而不是一个对象,那就很容易了,即
$x = ['name' => 'john', 'age' => 26]; // or: $x = (array)$obj
$x = ['id' => 123] + $x;
echo json_encode($x);
// {"id":123,"name":"john","age":26}
但是,重要的是要注意,在JSON中未定义属性排序且不应依赖 。如果你现在有所作为,那么这种改变实际上是无用的。
答案 1 :(得分:1)
不是很优雅,但......
$obj = new stdClass();
$obj->name = 'John';
$obj->age = 26;
$obj->id = 3645;
$name = $obj->name;
$age = $obj->age;
unset($obj->name);
unset($obj->age);
$obj->name = $name;
$obj->age = $age;
echo json_encode($obj);
答案 2 :(得分:0)
无法添加属性并强制它位于顶部。 您必须对对象属性或数组键进行排序。
这里有些挑剔:根据定义,JSON是无序的,但浏览器遵循插入顺序。更多:https://code.google.com/p/v8/issues/detail?id=164
JSON 4.3.3对象对象是Object类型的成员。 这是一个无序的属性集合,每个属性都包含一个 原始值,对象或函数。存储在属性中的函数 一个对象被称为方法。
<?php
function array_reorder_keys($array, $keynames){
if(empty($array) || !is_array($array) || empty($keynames)) return;
if(!is_array($keynames)) $keynames = explode(',',$keynames);
if(!empty($keynames)) $keynames = array_reverse($keynames);
foreach($keynames as $n){
if(array_key_exists($n, $array)){
$newarray = array($n=>$array[$n]); //copy the node before unsetting
unset($array[$n]); //remove the node
$array = $newarray + array_filter($array); //combine copy with filtered array
}
}
return $array;
}
$obj = new stdClass();
$obj->name = 'John';
$obj->age = 26;
$obj->id = 3645;
function get_json_sorted($object, $array) {
return json_encode(array_reorder_keys(get_object_vars($object), $array));
}
var_dump(get_json_sorted($obj, array('id', 'name', 'age')));
答案 3 :(得分:0)
这是一个解决方案。将对象转换为关联数组。从数组中获取最后一项(键和值) (我假设id
是最后一个元素)并将其移至面前。最后将assoc数组转换回对象。
$data_array = json_decode(json_encode($obj), true);
if(is_array($data_array)) {
end($data_array);
$data_array = array_merge(array(key($data_array) => array_pop($data_array)), $data_array);
$data = json_decode(json_encode($data_array), false);
}