Po części sam już sobie odpowiedziałeś na to pytanie:
Cytat(Booster @ 19.12.2013, 09:44:10 )

jeśli będą kategorie z tej drugiej pętli
Problem jest taki, że chcemy zrobić coś (wyświetlić znak) pod warunkiem zajścia zdarzenia, które nastąpi w przyszłości (druga pętla foreach). Tego nie da się zrobić w locie, bo nie jesteśmy w stanie przewidzieć wyniku zdarzenia, które jeszcze nie nastąpiło. Skoro nie w locie, to trzeba najpierw sprawdzić oba warunki, wstępnie przygotować dane i dopiero wyświetlić wynik.
Wyrzuć z obu pętli instrukcje drukowania (echo) i zastąp je przypisaniem do innej zmiennej, np.
$kategorie_1 i
$kategorie_2. A konkretnie, zamiast
daj
$kategorie_1 .= ' , ';
$kategorie_1 .= $cat;
W drugiej pętli analogicznie z
$kategorie_2. No i wcześniej oczywiście zainicjuj te nowe zmienne jako puste łańcuchy (
$kategorie_1 = $kategorie_2 = '').
Teraz, po wykonaniu obu pętli sprawdź, czy obie są niepuste, i jeśli tak to wyświetl je wstawiając pomiędzy znak "|":
if ($kategorie_1 != '' AND
$kategorie_2 != '') echo ' | '; // albo if ( ! empty($kategorie_1) AND ! empty($kategorie_2)) echo ' | ';
Jeszcze taka sugestia: zamiast tych długich instrukcji warunkowych sprawdzających obecność danych kategorii spróbuj wykorzystać funkcję
in_array, definiując wcześniej dwie tablice z grupami kategorii. Wtedy całą listę warunków będziesz mógł zastąpić prostym:
$pierwsza_grupa_kategorii = array('KRAJ', 'ŚWIAT', 'GOSPODARKA', 'SPOŁECZEŃSTWO', 'KULTURA', 'HISTORIA', 'FILOZOFIA'); // ...
foreach($categories as $cat) {
if (in_array($cat, $pierwsza_grupa_kategorii) { // ...
}
}
... a grupami kategorii będziesz mógł elastycznie zarządzać z poziomu tych dodatkowych tablic, a nawet elegancko te tablice definiować z bazy danych.