Как удалить последний цикл из foreach?

#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"   ;
        }
    }
}