Intereting Posts
Как установить переменную на странице PHP, передать ее в файл CSS и присвоить ее одному атрибуту CSS? Почему PHP создает новый экземпляр singleton каждый раз, когда запускается скрипт, вызывающий Foo :: getInstance ()? Лучшее место для хранения больших объемов данных сеанса удалить из S3 с помощью api php с помощью шаблона Может возникнуть символ «backspace» PHP во время выхода? Метод Joomla 1.6 JCategories :: get () создает «PHP Fatal error: Allowed memory outed» в пользовательском компоненте MVC Нельзя просто использовать имя таблицы PostgreSQL («отношения не существует») Как получить байтовые значения строки в PHP? Как получить IP-адрес клиента в PHP? Время автоматического выхода из системы phpmyadmin Как импортировать таблицу в phpmyadmin? Я получил ошибку размера файла Как хранить файлы в MongoDB? Межпроцессное взаимодействие с использованием именованных каналов в C # + PHP Как перезаписать существующую папку или файл в php ftp upload? Пользовательские классы в CodeIgniter

Добавить свойство в stdClass в верхней части объекта в php

При создании объекта в php, используемом для возврата JSON, можно добавить свойство и заставить его идти вверху? Мне бы это понравилось, поскольку объект был открыт через API, и хорошо иметь идентификаторы вверху.

Например:

$obj = new stdClass(); $obj->name = 'John'; $obj->age = 26; $obj->id = 3645; 

Когда вы json_encode() это, он превращается в:

 { "name": "John", "age": 26, "id": 3645 } 

Есть ли способ заставить id в верхней части объекта, даже если он добавлен последним? Обратите внимание: я не могу просто добавить id перед добавлением name и age из-за другого зависимого кода.

Related of "Добавить свойство в stdClass в верхней части объекта в php"

Это легко, если вы используете ассоциативный массив вместо объекта, т. Е.

 $x = ['name' => 'john', 'age' => 26]; // or: $x = (array)$obj $x = ['id' => 123] + $x; echo json_encode($x); // {"id":123,"name":"john","age":26} 

Однако важно отметить, что в JSON упорядочение свойств не определено и на него нельзя положиться . Если у вас в настоящее время есть работы, это изменение было бы бесполезно на самом деле.

Не очень элегантный, но …

 $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); с $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); с $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); 

Хм, хороший вопрос!

Невозможно добавить свойство и заставить его идти вверху. Вы должны отсортировать свойства объекта или ключи массива.

Вот некоторые из них: JSON по определению не упорядочен, но браузеры соблюдают порядок вставки . Подробнее: https://code.google.com/p/v8/issues/detail?id=164

JSON 4.3.3 Object Объект является членом типа 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'))); с <?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'))); 

Это решение. Поверните объект в массив-ассоциированный элемент. Получите последний элемент (как ключ, так и значение) от массива (я предполагаю, что id – последний элемент) и переместите его на передний план. Наконец, преобразуйте массив-помощник обратно в объект.

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