2012-06-27 4 views
0

В коде ниже я бы ожидатьPhp: array_filter меняет формат данных

t2: [{"value":"".....}, {}, {}] 

, но вместо этого я получаю

t2: {"0":{"value":"",.. , "1":{}, .. } 

даже литье

json_encode((array) $t2); 

не делает его работу
thx

function filter($var) { 
    return($var->id < 4); 
} 

$t1=json_decode('[{"value":"","id":"0","key":"algo"},{"value":"0.8","id":"-1","key":"cout"},{"value":"2012-07-21","id":"3","key":"date"},{"value":"","id":"0","key":"europe"},{"value":"","id":"0","key":"inria"},{"value":"1","id":"4","key":"ndOfRates"},{"value":"part","id":"0","key":"offre"},{"value":"","id":"0","key":"paris"},{"value":"Ut enim quisque sibi plurimum confidit et ut quisque maxime virtute et sapientia sic munitus est, ut nullo egeat suaque omnia in se ipso posita iudicet, ita in amicitiis expetendis colendisque maxime excellit. Quid enim? Africanus indigens mei? Minime hercule! ac ne ego quidem illius; sed ego admiratione quadam virtutis eius, ille vicissim opinione fortasse non nulla, quam de meis moribus habebat, me dilexit; auxit benevolentiam consuetudo. Sed quamquam utilitates multae et magnae consecutae sunt, non sunt tamen ab earum spe causae diligendi profectae. Hae duae provinciae bello quondam piratico catervis mixtae praedonum a Servilio pro consule missae sub iugum factae sunt vectigales. et hae quidem regiones velut in prominenti terrarum lingua positae ob orbe eoo monte Amano disparantur. Ultima Syriarum est Palaestina per intervalla magna protenta, cultis abundans terris et nitidis et civitates habens quasdam egregias, nullam nulli cedentem sed sibi vicissim velut ad perpendiculum aemulas: Caesaream, quam ad honorem Octaviani principis exaedificavit Herodes, et Eleutheropolim et Neapolim itidemque Ascalonem Gazam aevo superiore exstructas. Post hoc impie perpetratum quod in aliis quoque iam timebatur, tamquam licentia crudelitati indulta per suspicionum nebulas aestimati quidam noxii damnabantur. quorum pars necati, alii puniti bonorum multatione actique laribus suis extorres nullo sibi relicto praeter querelas et lacrimas, stipe conlaticia victitabant, et civili iustoque imperio ad voluntatem converso cruentam, claudebantur opulentae domus et clarae. Et quoniam apud eos ut in capite mundi morborum acerbitates celsius dominantur, ad quos vel sedandos omnis professio medendi torpescit, excogitatum est adminiculum sospitale nequi amicum perferentem similia videat, additumque est cautionibus paucis remedium aliud satis validum, ut famulos percontatum missos quem ad modum valeant noti hac aegritudine colligati, non ante recipiant domum quam lavacro purgaverint corpus. ita etiam alienis oculis visa metuitur labes.","id":"4","key":"text"},{"value":"on","id":"0","key":"type"}]'); 

$t2 = array_filter($t1, "filter"); 

echo 't2: '.json_encode($t2); 
+0

Доза json_encode ($ t1) дает ту же проблему? и как насчет json_encode (array_values ​​($ t2))? –

+0

no t1: [{"value": "", "id": "0", "key": "algo"}, {"value": "0.8", "id": "- 1", "key ":" соиЬ "}, {" значение ":" 2012-07-21" , "идентификатор": "3", "ключ": "дата"}, { "значение": "", "идентификатор":» 0" , "ключ": "Европа"}, { "значение": "", "идентификатор": "0", "ключ": "INRIA"}, { "значение": "1", "идентификатор": «4», «key»: «ndOfRates»}, {«value»: «part», «id»: «0», «key»: «off ....... Вот почему это странно –

+2

json_encode (array_values ​​($ t2)) кажется хорошим –

ответ

2

В PHP нет никакой разницы между ассоциативными и числовыми массивами. Поэтому при преобразовании в JSON json_encode должен выводить из ключей массива, должен ли он быть закодирован как массив или объект. Он делает это путем тестирования, чтобы убедиться, что (a) ключи являются числовыми и (b), если они являются последовательными, начиная с 0; если оба теста пройдут, он будет закодирован как массив.

Когда вы используете array_filter, вы удаляете некоторые из ключей. Остальные не перенумерованы, поэтому ключи больше не являются последовательными. Это означает, что json_encode указывает, что это должен быть объект, а не массив при кодировании в JSON.

Вы можете исправить это, перенумеровав клавиши. Используйте array_values для этого:

echo 't2: '.json_encode(array_values($t2)); 
+0

ОК, вот почему мои догадки работают, спасибо :-) –

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