2010-08-26 4 views
0

У меня есть список URL-адресов, каждая страница является специфическая категория:PHP массивы и вложенные циклы

http://www.site.com/category-1/page.html 
http://www.site.com/category-2/page.html 
http://www.site.com/category-3/page.html 

На каждой странице, скажем, 4 шт. Я хочу, чтобы извлечь каждый элемент на каждой странице и назначить его это соответствующий номер категории т.е.

category-1_ITEM - CAT-1 
category-1_ITEM - CAT-1 
category-1_ITEM - CAT-1 
category-1_ITEM - CAT-1 

category-2_ITEM - CAT-2 
category-2_ITEM - CAT-2 
category-2_ITEM - CAT-2 
category-2_ITEM - CAT-2 

category-3_ITEM - CAT-3 
category-3_ITEM - CAT-3 
category-3_ITEM - CAT-3 
category-3_ITEM - CAT-3 

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

$urls = array(
"http://www.site.com/category-1/page.html", 
"http://www.site.com/category-2/page.html", 
"http://www.site.com/category-3/page.html" 
); 

foreach ($urls as $url) { 

//Load Page, find items 

foreach($items as $item) { 

preg_match('#http\:\/\/www\.site\.com\/(.*?)\/page\.html#is',$url,$result); 

switch ($result[1]){ 

case "category-1": $cat = 'CAT-1'; break; 
case "category-2": $cat = 'CAT-2'; break; 
case "category-3": $cat = 'CAT-3'; break; 
} 

echo $item . ' - ' . $cat . '<br>'; 


} 
} 

Это то, что он выводит:

category-1_ITEM - CAT-1 
category-1_ITEM - CAT-1 
category-1_ITEM - CAT-1 
category-1_ITEM - CAT-1 

category-1_ITEM - CAT-2 
category-1_ITEM - CAT-2 
category-1_ITEM - CAT-2 
category-1_ITEM - CAT-2 

category-2_ITEM - CAT-2 
category-2_ITEM - CAT-2 
category-2_ITEM - CAT-2 
category-2_ITEM - CAT-2 

category-1_ITEM - CAT-3 
category-1_ITEM - CAT-3 
category-1_ITEM - CAT-3 
category-1_ITEM - CAT-3 

category-2_ITEM - CAT-3 
category-2_ITEM - CAT-3 
category-2_ITEM - CAT-3 
category-2_ITEM - CAT-3 

category-3_ITEM - CAT-3 
category-3_ITEM - CAT-3 
category-3_ITEM - CAT-3 
category-3_ITEM - CAT-3 

Любые идеи о том, что я делаю неправильно? У меня такое чувство, что это простая ошибка, я просто этого не вижу.

+0

Эти ребята, вероятно, правы, вам нужно добавить код для «// Загрузить страницу, найти элементы» для любого реального ответа. –

ответ

1

Проблема в этом коде:

//Load Page, find items 

Если Я могу смело предположить, что вы, вероятно, делаете что-то вроде:

$items[] = "some content"; 
$items[] = "some content"; 

Не с константами, а с ключом то, что вы написали до знака равенства. Все время вы добавляете новые элементы в конец массива, поэтому в первый раз у вас есть элементы с первой страницы. Во второй раз вы добавляете содержимое второй страницы к этому, и у вас есть оба из них в массиве. Другими словами: вы забываете сбросить $ items. Добавьте $items = array() в начало //Load page, find items, и все должно быть в порядке.

Если вы исходите с другого языка, проблема, пожалуй, лучше объясняется в более технических терминах: в блоках кода php не создается новая область. В основном работают только функции.

+0

Действительно! Я люблю простое решение, спасибо! –

0

Редактировать: Я считаю, что ваша проблема в том, что вы не очищаете массив $ items при каждом цикле.

Я тестировал следующий код:

$urls = array(
"http://www.site.com/category-1/page.html", 
"http://www.site.com/category-2/page.html", 
"http://www.site.com/category-3/page.html" 
); 

$id = 0; 

foreach ($urls as $url) { 

$items = array(
"i" . $id++, 
"i" . $id++, 
"i" . $id++ 
); 


foreach($items as $item) { 

preg_match('#http://www.site.com/(.*?)/page.html#is',$url,$result); 

switch ($result[1]){ 

case "category-1": $cat = 'CAT-1'; break; 
case "category-2": $cat = 'CAT-2'; break; 
case "category-3": $cat = 'CAT-3'; break; 
} 

echo $item . ' - ' . $cat . '<br>'; 


} 
echo "<br/>"; 
} 

и я получаю следующий результат:

i0 - CAT-1 
i1 - CAT-1 
i2 - CAT-1 

i3 - CAT-2 
i4 - CAT-2 
i5 - CAT-2 

i6 - CAT-3 
i7 - CAT-3 
i8 - CAT-3 
+0

И спасибо вам за ваши усилия. :) –

Смежные вопросы