#php #json
Вопрос:
Я использую фильтрацию json с помощью своего собственного json. Как ограничить foreach для последнего цикла?
<?php
$data = '{"page":1,
"results":
[{
"gender": "male",
"language":"English"
},
{
"gender": "male",
"language":"Jerman"
},
{
"gender": "feamle",
"language":"English"
}]}';
$json = json_decode($data, true);
foreach ($json['results'] as $r){
if($r['language'] == "English")
{
echo $r['language']."},{n";
}
}
Выход :
English},{
English},{
Ожидаемый результат :
English},{
English
Вопрос в том, как удалить / исключить последнее»}, {«в конце цикла?
Комментарии:
1. То есть вы имеете в виду, что если есть два (или более) одинаковых выходных значения (оба на английском языке), то просто отобразите ИХ ОДИН РАЗ ?
2. Просто я говорю об «английском», я просто хочу удалить последнее «},{» в конце. Спасибо
3. Я понимаю. Пожалуйста, смотрите мой ответ ниже
Ответ №1:
Просто сохраните общее количество результатов, а затем, если выходная строка является последним количеством, не выводите символы },{
Таким образом, коды (рабочие) являются:
<?php
$data = '{"page":1,
"results":
[{
"gender": "male",
"language":"English"
},
{
"gender": "male",
"language":"Jerman"
},
{
"gender": "feamle",
"language":"English"
}]}';
$json = json_decode($data, true);
$totalcount=0;
foreach ($json['results'] as $r){
if($r['language'] == "English")
{ $totalcount ; }
}
$index=0;
foreach ($json['results'] as $r){
if($r['language'] == "English")
{
$index ;
if ($index!=$totalcount) {
echo $r['language']."},{n"; }
else {
echo $r['language'];}
}
}
?>
Ответ №2:
Вот один из способов сделать это с помощью array_filter, array_column и implode.
- array_filter — используется для фильтрации всех записей, кроме тех, которые имеют
language: English
- array_column — берет отфильтрованный массив и извлекает один «столбец»,
language
- implode — собирает массив обратно в строку и соединяет каждый элемент разделителем,
},{n
http://sandbox.onlinephpfunctions.com/code/20120eb9a9fdfbc3c0d29ea57036e7cf1d2d5409
<?php
$data = '{"page":1,
"results":
[{
"gender": "male",
"language":"English"
},
{
"gender": "male",
"language":"Jerman"
},
{
"gender": "feamle",
"language":"English"
}]}';
$json = json_decode($data, true);
// Filter out everything except entries that have English
$filtered = array_filter($json['results'], function($result){
return $result['language'] === 'English';
});
// Pull out a specific "column" (`language`) from the array.
$languages = array_column($filtered, 'language');
// Use `implode` to join all the entries together.
// The separator will only be used between the elements. It will not be added to the end.
echo implode("},{n", $languages);
Но самое простое решение вашей первоначальной идеи-просто использовать простой счетчик, чтобы определить, в каком «цикле» вы находитесь, и выводить разделитель только в том случае, если вы не находитесь в конечном цикле.
http://sandbox.onlinephpfunctions.com/code/fe18e8584320e680aa194a4faa6fe7edc31ed6ac
<?php
$data = '{"page":1,
"results":
[{
"gender": "male",
"language":"English"
},
{
"gender": "male",
"language":"Jerman"
},
{
"gender": "feamle",
"language":"English"
}]}';
$json = json_decode($data, true);
$totalCount = count($json);
$currentLoop = 0;
foreach ($json['results'] as $r) {
$currentLoop ;
if ($r['language'] == "English") {
// Always output the language
echo $r['language'];
// But only output the separator if we're not in the final loop.
// On the final loop, $currentLoop will equal $totalCount.
if ($currentLoop < $totalCount) {
echo "},{n" ;
}
}
}