Перестановка логики, использующей многократные условия foreach

#php

#php

Вопрос:

У меня есть некоторый код, который принимает URL-адрес rss-канала, расширяет ссылку rss и получает отдельные ссылки внутри этого XML-канала. После проверки, существует ли ссылка, я вставляю ее в таблицу, если она не существует, и ничего не делаю, если она существует. Однако мой код становится все более нечитаемым, и еще одна проверка, требующая другого foreach, должна быть еще более нечитаемой.

Это код

 public function links_cron_job(){
    //Get Rss Links
    $this->db->select("the_link_itself");
    $query = $this->db->get_where("search_engine_links", array("link_type" => "rss"));

    foreach ($query->result() as $row){
        $url = $row->the_link_itself;
        $rss = Feed::loadRss($url);
        foreach ($rss->item as $item) {
            $this->db->where('the_link_itself',$item->link);
            $query3 = $this->db->get('search_engine_links');
            if ($query3->num_rows() > 0){
                echo 'duplicates are there';
            }else{
                $data = array(
                    'link_country' => 'usa',
                    'the_link_itself' => $item->link,
                    'link_category' => 'news_website',
                    'link_added_by' => 'admin',
                    'link_type' => 'ordinary_link',
                    'link_local_type' => 'news',
                    'link_region' => 'countrywide',
                    'link_city' => 'washington',
                    'date_added' => $item->timestamp,
                    'last_updated' => time()
                );
                $this->db->insert('search_engine_links', $data);
                echo 'no duplicates are there';
            }
        }
    }
}
 

Каким был бы другой подход к выполнению того, что я делаю?

Комментарии:

1.Хорошее расположение отступов в коде поможет нам прочитать код и, что более важно, поможет вам прочитать и отладить ваш код . Взгляните на стандарт кодирования для вашей собственной выгоды. Возможно, вас попросят внести изменения в этот код через несколько недель / месяцев, и в конце вы поблагодарите меня.

2. Спасибо, я сделаю отступ.

3. Я сделал это за вас

4. Рабочее решение, требующее рефакторинга, больше подходит для проверки кода .

Ответ №1:

Обычно я бы сказал, просто введите возврат. Но в этом случае вам все равно придется работать в дополнительных итерациях. Так что в этом случае, по крайней мере, мы знаем, что закончили с этой итерацией, поэтому, по крайней мере, мы можем добавить оператор continue:

 <?php
foreach ($rss->item as $item) {
   $this->db->where('the_link_itself',$item->link);
   $query3 = $this->db->get('search_engine_links');
   if ($query3->num_rows() > 0) {
      echo 'duplicates are there';
      continue;
   }
   $data = array(
      'link_country' => 'usa',
      'the_link_itself' => $item->link,
      'link_category' => 'news_website',
      'link_added_by' => 'admin',
      'link_type' => 'ordinary_link',
      'link_local_type' => 'news',
      'link_region' => 'countrywide',
      'link_city' => 'washington',
      'date_added' => $item->timestamp,
      'last_updated' => time()
   );
   $this->db->insert('search_engine_links', $data);
   echo 'no duplicates are there';
}