将属性添加到php中对象顶部的stdClass

时间:2014-07-23 00:27:26

标签: php json object stdclass

在用于返回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在对象的顶部,即使它最后添加?请注意,由于其他相关代码,我无法在添加idname之前添加age

4 个答案:

答案 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类型的成员。 这是一个无序的属性集合,每个属性都包含一个   原始值,对象或函数。存储在属性中的函数   一个对象被称为方法。

检查一下:http://ideone.com/Hb4rGQ

<?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);
}