Судя по всему вы циклом проходите по всем товарам?
Что такое
spec? В вашем примере это константа, полагаю проблема именно в этом.
Вероятно,
spec должна быть переменной:
$good[$spec] = array('mall', 'discount', 'promotion');
// ^
foreach($good[$spec] as $mall) {
// ^
// ...
}
---
UPD: Теория с константой оказалась ошибочной и в данном случае
spec интерпретируется, как строковой литерал, однако так делать не рекомендуется:
php.net/manual/ru/language.types.array.php
Почему $foo[bar] неверно?
Всегда заключайте в кавычки строковый литерал в индексе ассоциативного массива. К примеру, пишите $foo['bar'], а не $foo[bar]. Но почему? Часто в старых скриптах можно встретить следующий синтаксис:
<?php
$foo[bar] = 'враг';
echo $foo[bar];
// и т.д.
?>
Это неверно, хотя и работает. Причина в том, что этот код содержит неопределенную константу (bar), а не строку ('bar' - обратите внимание на кавычки). Это работает, потому что PHP автоматически преобразует "голую строку" (не заключенную в кавычки строку, которая не соответствует ни одному из известных символов языка) в строку со значением этой "голой строки". Например, если константа с именем bar не определена, то PHP заменит bar на строку 'bar' и использует ее.