2013-09-15 2 views
0

У меня есть массив, который может выглядеть примерно так:Кодирование JSON в качестве объекта, даже если она имеет нулевой индекс

array(
    1 => "foo", 
    4 => "bar" 
) 

Когда я json_encode его, получается что-то вроде этого:

{ 
    "1": "foo", 
    "4": "bar" 
} 

Именно так мне это нужно.

Однако, существует вероятность того, что массив будет выглядеть следующим образом:

array(
    0 => "baz" 
) 

В этом случае я хотел бы в JSON, в конечном итоге, как это:

{ 
    "0": "baz" 
} 

Но вместо этого, он заканчивается следующим образом:

[ 
    "baz" 
] 

Есть ли способ заставить кодировщик JSON предположить, что это объект вместо массива?

EDIT: К сожалению, я упростил на этот пост, но сейчас я понимаю, что это очень важно: Этот массив является вложенным в другой массив, который должен быть массивом, не объекта.

РЕДАКТИРОВАТЬ 2: Пример этого:

array(
    0 => array(
    0: "baz" 
), 
    1 => array(
    4: "bar" 
) 
) 

должно стать:

[ 
    { 
    0: "baz" 
    }, 
    { 
    4: "bar" 
    } 
] 

ответ

2

Попробуйте использовать это:

$test = array(
    0 => array(
    0=> "baz" 
), 
    1 => array(
    4=> "bar" 
) 
); 

$json = json_encode($test, JSON_FORCE_OBJECT); 

var_dump($json); 

Доступно с PHP 5.3.0.

+0

Это кажется для меня недействительным. – JJJollyjim

+1

Если вы используете 5.3.0+, используйте это (что, надеюсь, вы есть), если нет, тогда мой ответ должен сделать трюк. –

+0

Извините, я ошибся, он действительно работает, я думаю ... все еще проверяю. – JJJollyjim

0

В ролях это объект первого:

<?php 
$array = array(
    0 => "baz" 
); 

echo json_encode((object)$array); 
?> 

Выходы:

{"0":"baz"} 

EDIT:

<?php 
$array = array(
    0 => array(
    0=> "baz" 
), 
    1 => array(
    4=> "bar" 
) 
); 

$array = castOnConsecutiveRecursive($array); 
echo json_encode($array); 

//json_encode acts as you want unless the array is consecutive from 0, so if that's the case then we have to cast it 
function isConsecutive($array){ 
    $lastIndex = null; 
    foreach($array as $key=>$value){ 
     if(is_null($lastIndex)){ 
      $lastIndex = $key; 
      if($key !== 0) 
       return false; 
      continue; 
     } 
     if($lastIndex !== $key+1) 
      return false; 
    } 
    return true; 
} 

function castOnConsecutiveRecursive($array){ 
    foreach($array as $key => $value){ 
     if(is_array($value)){ 
      $array[$key] = castOnConsecutiveRecursive($value); 
      if(isConsecutive($value)) 
       $array[$key] = (object)$value; 
     } 
    } 
    return $array; 
} 
?> 

EDIT 2: Doh, не видел эту опцию в документации, используйте teo «s ответ, если вы используете PHP 5.3.0+

+0

Отличная идея, спасибо! Однако я забыл упомянуть, что этот массив фактически встроен в другой массив, который должен быть массивом, а не объектом. Есть ли решение для этого? – JJJollyjim

+0

@ JJ56 Можете ли вы показать мне пример того, что вы имеете в виду, чтобы я мог ответить более полно? –

+1

Да, не используйте PHP. Целая парадигма/словарь-двойственность вполне справедливо является источником огромных разочарований для многих и имеет только незначительно благоприятные случаи использования. –

Смежные вопросы