2016-01-10 2 views
2

У меня есть массив полных подмассивов, которые, в свою очередь, являются полными именами источников и их веб-сайта URL, такими как The New York Times и http://newyorktimes.com.Динамически нумерованные переменные в цикле Еогеаспа

Я показываю список ссылок, в которых название ссылается на URL-адрес, и я хотел бы показать значок знака сайта перед каждой ссылкой - это простая идея в теории.

В настоящее время список ссылок прекрасно работает, код, который тянет значок, возвращает его правильный URL-адрес, и в основном все работает нормально, за исключением того, что он работает только для первой ссылки, и страница становится беспорядочной после этого. Я, наконец, понял, что, поскольку код должен быть запущен для каждого url в цикле foreach, должен произойти некоторый конфликт переменных, когда цикл выполняется во второй раз.

Проблема заключается в том, что мой список динамически заполнен (в WordPress), поэтому я никогда не знаю количество ссылок в массиве и то, что они есть, поэтому мне интересно: есть ли способ, которым я могу динамически числиться или иным образом изменять переменные каждый раз, когда цикл foreach окружает так, чтобы не было нескольких экземпляров одних и тех же переменных?

Вот часть моего кода, это вопрос:

echo '<ul class="ll_list">'; 
    foreach ($ll_entries as $ll_entry) { 

     /*----- GET FAVICON -----*/ 
     /* This code needs to run for each url in the array, pull the 
     favicon, and then the favicon's url needs to be echoed down 
     below. */ 

     $url = esc_attr($ll_entry['ll_url']); 
     $doc = new DOMDocument(); 
     $doc->strictErrorChecking = FALSE; 
     $doc->loadHTML(file_get_contents($url)); 
     $xml = simplexml_import_dom($doc); 
     $arr = $xml->xpath('//link[@rel="shortcut icon"]'); 
     $favicon = $arr[0]['href']; 

     /*-----------------------*/ 

     echo '<li class="ll_list_item">'; 

     if (file_exists($favicon)) { 
      echo '<img class="ll_logo_img" src="'.$favicon.'" alt="'. esc_attr($ll_entry['ll_title']).'" /> '; 
     } else { 
      echo '<span class="dashicons dashicons-arrow-right"></span> '; 
     } 

     echo '<a href="' . esc_attr($ll_entry['ll_url']) . '" title="Visit ' . esc_attr($ll_entry['ll_title']) . ' &raquo;" target="_blank">'; 
     echo esc_attr($ll_entry['ll_title']); 
     echo '</a>'; 
     echo '</li>'; 
    } 
echo '</ul>'; 

Правильная переменная затем также должны быть призваны к <img> тег ниже, который только вторит если файл существует Favicon ... так что, возможно, тоже забрасывает ключ в работах?

Я искал много об этом, и я нашел немного документации о «переменных переменных». Я не совсем уверен, как их использовать здесь, но в массиве нет ничего, что я мог бы использовать как переменную, если только не удастся удалить специальные символы из URL-адреса и использовать это.

Любая помощь была бы высоко оценена, спасибо! Если есть более простой способ достичь моей цели, я все уши.

+0

У вас есть некоторые ошибки (посмотрите на журналы сервера/PHP)? – akmozo

+0

Вы даете слишком много информации. Похоже, что все, что вам нужно сделать, это сделать цикл for с count (array) как число, которое вы считаете d собственным, или просто добавить счет к переменной, с которой работаете. Но это сложно сказать, потому что вы просто свалили столько информации, изолировали ее больше. – Andrew

+0

@Shoelaced BTW, ваш опубликованный код в порядке, я проверил его с 3 URL (NYTimes, SO и google), и он работает хорошо, поэтому попробуйте проверить другие моменты ... – akmozo

ответ

1

Если вы подозреваете, что в коде get_favicon существует конфликт с именованием переменных, включите его в функцию. Переменные в функции (по умолчанию) являются локальными для этой функции и не могут испортить внешнюю область.

function get_favicon($ll_entry) { 
    $url = esc_attr($ll_entry['ll_url']); 
    $doc = new DOMDocument(); 
    $doc->strictErrorChecking = FALSE; 
    $doc->loadHTML(file_get_contents($url)); 
    $xml = simplexml_import_dom($doc); 
    $arr = $xml->xpath('//link[@rel="shortcut icon"]'); 
    $favicon = $arr[0]['href']; 
    return $favicon;   
} 

Затем использовать эту функцию, чтобы заполнить вашу переменную $ FavIcon:

$favicon = get_favicon($ll_entry); 
// use it as before 

Убедитесь, что вы не определить свою функцию в цикле. Определение функции должно быть вне любых циклов, которые у вас могут быть.

+0

Вау, я просто потратил _strangest_ полчаса, пытаясь выяснить, что происходит на земле ... Я все еще не уверен, что знаю, но я все проверил, и я наконец пришел к выводу, что функция должна вытаскивать какой-то скрипт из моей второй ссылки вместо значка, потому что без этой ссылки он работает.Он также получает относительный путь для некоторых из них, и мне нужен абсолютный путь. Я отправлю новый вопрос о том, как исправить это, но я собираюсь дать вам чек, потому что вы ответили на мой вопрос о том, как предотвратить конфликты переменных. И это помогло разобраться, так что спасибо! – Shoelaced