json без индекса после сброса массива кодирования в php
Я надеюсь, что кто-нибудь может мне помочь. Мой json не проиндексирован (нет ни одного ключа над элементом)
[
{
"nome":"LABORGHINI GALLARDO",
"descrizione":"LAMBORGHINI GALLARDO ED. NERA- ANNO 2007- ",
"indirizzo_pubblicato":"autocaricateeea\/LABORGHINI GALLARDO31072013-023853\/LABORGHINI GALLARDO31072013-023853.json",
"indirizzo_immagine_copertina":"autocaricateeea\/LABORGHINI GALLARDO31072013-023853\/IMG_1414 (600x448).jpg",
"indirizzo_paginaauto":"autocaricateeea\/LABORGHINI GALLARDO31072013-023853\/index.html"
},
{
"nome":"RENAULT MEGANE",
"descrizione":"RENAULT MEGANE -ANNO 2006-DIESEL-CC. 1461",
"indirizzo_pubblicato":"autocaricateeea\/RENAULT MEGANE31072013-024103\/RENAULT MEGANE31072013-024103.json",
"indirizzo_immagine_copertina":"autocaricateeea\/RENAULT MEGANE31072013-024103\/P1080949 (600x450).jpg",
"indirizzo_paginaauto":"autocaricateeea\/RENAULT MEGANE31072013-024103\/index.html"
},
{
"nome":"FORD MONDEO",
"descrizione":"FORD MONDEO SINISTRATA- ANNO 2009- DIESEL- CC. 1997-",
"indirizzo_pubblicato":"autocaricateeea\/FORD MONDEO31072013-045216\/FORD MONDEO31072013-045216.json",
"indirizzo_immagine_copertina":"autocaricateeea\/FORD MONDEO31072013-045216\/P1080971 (600x450).jpg",
"indirizzo_paginaauto":"autocaricateeea\/FORD MONDEO31072013-045216\/index.html"
}
]
но после отмены удаления элемента с php json выглядит так:
{
"1": // <--- **** add a key before an element
{
"nome":"Fiat Punto ",
"descrizione":"Fiat Punto Bianca",
"indirizzo_pubblicato":"autocaricateeea\/Fiat Punto 14072013-042703\/Fiat Punto 14072013-042703.json",
"indirizzo_immagine_copertina":"autocaricateeea\/Fiat Punto 14072013-042703\/P1080713 (600x450).jpg",
"indirizzo_paginaauto":"autocaricateeea\/Fiat Punto 14072013-042703\/index.html"
},
...........
...........
...........
Как вы можете видеть, есть ключ перед элементом JSON. Я знаю, что это поведение вызвано unset ( PHP json_encode как объект после PHP-массива unset ()). Есть ли способ предотвратить такое поведение?
заранее спасибо
РУКОВОДИТЕЛЬ РАГАЗЗИНИ
6 ответов
Я все равно искал и пытался реализовать поведение, которое искал в своем вопросе, но ничего не нашел. Я предположил, что, как вы можете видеть в этом ответе, функция unset добавляет индексы в массив, потому что JSON_encode не поддерживает массивы с дырой. Итак, чтобы решить мою проблему, я загружаю файл JSON с помощью функции jQuery, удаляю элементы с помощью jQuery и вызываю функцию ajax для удаления файлов, связанных по адресу, содержащемуся в файле json:
$.getJSON('loadauto.json', function(result) {
var y = result;
$.each(result, function(i, field){
if(field.indirizzo_paginaauto == x){
delete result[i];
}
});
$.ajax({
async: true,
cache: false,
type: 'POST',
url: 'deleteauto.php',
data: { nuovofilejson: y, indirizzo: x},
success: function(data) {
alert ("Auto cancellata definitivamente");
},
error: function(data) {
alert ("Error");
}
});
}
Была та же проблема, пока я не нашел это решение:
В дополнение к технике array_values можно использовать array_splice, удалить элемент и переиндексировать за один шаг:
unset($a[1]);
Вместо:
array_splice($a, 1, 1);
цитируемый здесь: /questions/4537094/php-jsonencode-kak-obekt-posle-php-massiva-unset/4537103#4537103
Хотя вы решили свою проблему на стороне клиента, я подумал, что было бы полезно показать мое решение этой проблемы с помощью PHP, идея состоит в том, чтобы создать новый массив и исключить ненужные элементы, таким образом у вас не будет индексации проблема вызвана unset, что-то вроде этого:
$new_nodes= array();
for ($j = 0; $j < count($composition->nodes); $j++)
{
//exclude some nodes
if ($id!= $composition->nodes[$j]->id)
{
// store only the nodes that you want:
array_push($new_nodes, $composition->nodes[$j]);
}
}
// and finally, use the new modified nodes array:
$composition->nodes= $new_nodes;
Лучший способ сделать это,
$json_arr = array_values($json_arr);
Почему вы должны предотвратить такое поведение? Когда вы конвертируете json в массив PHP, независимо от формата JSON будет индексный массив (с указанными вами числами), независимо от того.
Если нумерация неправильная, используйте http://php.net/manual/en/function.array-values.php для исправления.
Восстановите свой JSON с помощью этого сценария PHP
<?php
$arr = array
(array('nome' => 'LABORGHINI GALLARDO',
'descrizione' => 'LAMBORGHINI GALLARDO ED. NERA- ANNO 2007-',
'indirizzo_pubblicato' => 'autocaricateeea/LABORGHINI GALLARDO31072013-023853/LABORGHINI GALLARDO31072013-023853.json',
'indirizzo_immagine_copertina' => 'autocaricateeea/LABORGHINI GALLARDO31072013-023853/IMG_1414 (600x448).jpg',
'indirizzo_paginaauto' => 'autocaricateeea/LABORGHINI GALLARDO31072013-023853/index.html'),
array('nome' => 'RENAULT MEGANE',
'descrizione' => 'RENAULT MEGANE -ANNO 2006-DIESEL-CC. 1461',
'indirizzo_pubblicato' => 'autocaricateeea/RENAULT MEGANE31072013-024103/RENAULT MEGANE31072013-024103.json',
'indirizzo_immagine_copertina' => 'autocaricateeea/RENAULT MEGANE31072013-024103/P1080949 (600x450).jpg',
'indirizzo_paginaauto' => 'autocaricateeea/RENAULT MEGANE31072013-024103/index.html'),
array('nome' => 'FORD MONDEO',
'descrizione' => 'FORD MONDEO SINISTRATA- ANNO 2009- DIESEL- CC. 1997-',
'indirizzo_pubblicato' => 'autocaricateeea/FORD MONDEO31072013-045216/FORD MONDEO31072013-045216.json',
'indirizzo_immagine_copertina' => 'autocaricateeea/FORD MONDEO31072013-045216/P1080971 (600x450).jpg',
'indirizzo_paginaauto' => 'autocaricateeea/FORD MONDEO31072013-045216/index.html')
);
$arr_json = json_encode($arr);
var_dump($arr_json);
?>
Предпочтительно JSON может быть проанализирован с JS, чтобы получить доступ к необходимой машине. Нет необходимости изменять JSON с помощью PHP.