Для меня эти 3 вида удовлетворяют большинство моих потребностей:
shared_ptr
- считаемый на ссылку, освобождение, когда счетчик достигает нуля
weak_ptr
- то же как выше, но это - 'ведомое устройство' для shared_ptr
, не может освободить
auto_ptr
- когда создание и освобождение происходят в той же функции, или когда объект нужно считать one-owner-only когда-либо. Когда Вы присваиваете один указатель на другого, вторые 'кражи' объект сначала.
у меня есть своя собственная реализация для них, но они также доступны в Boost
.
я все еще передаю объекты ссылкой (const
каждый раз, когда возможный), в этом случае вызываемый метод должен предположить, что объект жив только во время вызова.
существует другой вид указателя, что я использую это, я звоню hub_ptr. Именно, когда у Вас есть объект, должно быть доступным от объектов, вложенных в нем (обычно как виртуальный базовый класс). Это могло быть решено путем передачи weak_ptr
им, но это не имеет shared_ptr
к себе. Поскольку это знает, что эти объекты не жили бы дольше, чем он, это передает hub_ptr им (это - просто шаблонная обертка к регулярному указателю).
I think one approach would be to take advantage of the second parameter to json_decode, assoc
:
"When TRUE, returned objects will be преобразованы в ассоциативные массивы ».
Я считаю, что обычно легче работать с ассоциативными массивами, чем с классом stdClass
.
$str = '{
"core": {
"segment": [
{
"id": 7,
"name": "test1"
},
{
"id": 4,
"name": "test2"
}
]
}
}';
print "<pre>";
print_r(json_decode($str));
print "</pre>";
print "<pre>";
print_r(json_decode($str,true));
print "</pre>";
Это создает сначала версию объекта, а затем ассоциативный массив:
stdClass Object
(
[core] => stdClass Object
(
[segment] => Array
(
[0] => stdClass Object
(
[id] => 7
[name] => test1
)
[1] => stdClass Object
(
[id] => 4
[name] => test2
)
)
)
)
Array
(
[core] => Array
(
[segment] => Array
(
[0] => Array
(
[id] => 7
[name] => test1
)
[1] => Array
(
[id] => 4
[name] => test2
)
)
)
)
Думаю, я бы сделал что-то вроде: создать новый пустой массив, декодировать как ассоциативный массив, извлечь элементы сегмента и объединить их в новый пустой массив. Итак:
$segments = array();
// assuming you had a bunch of items in the $strings array
foreach ($strings as $str) {
$item = json_decode($str,true);
$segments = array_merge($item['core']['segment], $segments);
}
Теперь вы можете закодировать это в json следующим образом:
$final_json = json_encode(array('segments'=>$segments));
Внешний объект содержит два элемента с именем «сегмент». Хотя это допустимый JSON, невозможно иметь объект PHP с двумя разными элементами с одинаковым именем.