PHP для цикла, повторяющего массив JSON, проблема с последней запятой

Здравствуйте, я использую цикл for для подготовки строки JSON.

//prepare a JSON Array [ obj1,obj2,obj3.... ]

echo "[";

foreach ($usernames as $value){
    //prepare a JSON String for $username
    //e.g. {"username":$value}

    // insert comma if there is next element in the array
    echo ",";
}

echo "]";

Моя проблема в том, что запятая в конце является неправильным форматом в JSON. Как определить, что цикл for достиг конца массива, подготавливая последний элемент, и, таким образом, останавливает добавление всего, кроме последнего символа запятой?

Спасибо


person Gapton    schedule 19.09.2011    source источник
comment
знаете ли вы о json_encode()?   -  person Brian Glaz    schedule 19.09.2011
comment
Создайте массив и отправьте его через json_encode() вместо того, чтобы формировать строку json вручную.   -  person evan    schedule 19.09.2011
comment
я знаю об этом, но каким-то образом я совершенно забыл об этом, о боже .... спасибо, что напомнили мне реализовать функцию более правильным образом.   -  person Gapton    schedule 19.09.2011


Ответы (4)


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

$arr = array("a"=>"one", "b"=>"two");

echo $json_encode($arr);

http://php.net/manual/en/function.json-encode.php

person Trevor    schedule 19.09.2011
comment
Я извлекал данные из БД, поэтому я застрял в мышлении манипулирования строками. Как было предложено, я реализовал его так, что теперь он создает ассоциативный массив как объект и сохраняет этот объект в массиве. Затем я вызываю json_encode для кодирования этого массива. Код чистый и аккуратный, спасибо. - person Gapton; 19.09.2011
comment
Конечно вещь. Я думал, что вы, возможно, сами создаете JSON для какой-то другой цели. :) - person Trevor; 19.09.2011
comment
Почему этот фрагмент с явной опечаткой набрал 5 голосов? - person mickmackusa; 05.09.2019
comment
@micmackusa, возможно, вы могли бы указать на опечатку или исправить ее. Я этого не вижу. - person Trevor; 25.12.2019
comment
3v4l.org/NJlvH Я дам вам минуту, чтобы попытаться выяснить это самостоятельно. - person mickmackusa; 25.12.2019

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

person K-ballo    schedule 19.09.2011
comment
Никто не должен рекомендовать взламывать строки json. Важно: `json_encode() не только предлагает самую чистую технику, но и экранирует, когда это необходимо. - person mickmackusa; 25.12.2019

Ну, вы можете сохранить все это в переменной, а затем, когда это будет сделано, вы можете просто сделать:

$jsonVar = substr($jsonVar, 0, -1);

Прежде чем добавить последний "]"

person Jason Dean    schedule 19.09.2011
comment
Мне больше нравится ответ Тревора. :) - person Jason Dean; 19.09.2011
comment
А если у него 0 пользователей? он станет ] вместо [] - person Dani; 19.09.2011
comment
Затем вы делаете echo $json_encode((object)$arr); - person awm; 19.09.2011
comment
Спасибо за это быстрое решение. В итоге я создал их в php-объектах и ​​закодировал с помощью json_encode, потому что это более аккуратно. Но приятно знать эту строковую операцию, которую я никогда раньше не использовал (я пришел из Java и C# C++, у меня был только 1 день в PHP) - person Gapton; 19.09.2011
comment
Никто не должен рекомендовать взламывать строки json. Важно: `json_encode() не только предлагает самую чистую технику, но и экранирует, когда это необходимо. - person mickmackusa; 25.12.2019

Решение конкретно для вашей проблемы

echo "[";
ob_start();
foreach ($usernames as $value){
    //prepare a JSON String for $username
    //e.g. {"username":$value}

    // insert comma if there is next element in the array
    echo ",";
}
$data = ob_get_contents();
ob_end_clean() ;
echo rtrim($data,',');
echo "]"

но правильный/стандартный/более простой способ - просто сделать json_encode($usernames);

person Mr Coder    schedule 19.09.2011
comment
Никто не должен рекомендовать взламывать строки json. Важно: `json_encode() не только предлагает самую чистую технику, но и экранирует, когда это необходимо. - person mickmackusa; 25.12.2019