Установить динамические переменные в цикле foreach - PullRequest
0 голосов
/ 14 декабря 2011

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

Код, который у меня сейчас есть:

foreach($categories as $category)
{
    $category_ads[] = Advert::listforPageArea(2, 1, $category['id']);
}

Функция Advert::listforPageArea возвращает объект рекламы в зависимости от выбранной категории.

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

Я изо всех сил пытаюсь объяснить, что именно хочу, но я просто хочу установить пользовательский контент в цикле.

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

То, что вы ищете, называется «переменные переменные».

См. http://foundationphp.com/blog/2010/12/18/understanding-php-variable-variables/

Связанная запись в блоге также отвечает на вопрос о области видимости переменных (в отличие от ответа Джеффроя, переменные переменные действительны вне цикла, в котором они созданы) и утверждает (правильно), что этот метод крайне небезопасен без проверки имен переменных.

Не могли бы вы вместо этого использовать массив внутри массива? $arr['cat1']['cat2']

РЕДАКТИРОВАТЬ: как сделать это с многомерными массивами (см. http://php.net/manual/en/language.types.array.php)

$ads = array(); // not explicitly needed, but clarifying
// ... some code
foreach($categories as $category)
{
    if(!array_key_exists($category, $ads)) { $ads[$category] = array(); } // not explicitly needed
    $ads[$category['name?']][] = Advert::listforPageArea(2, 1, $category['id']);
    // or (see comment below)
    $ads[$category][] = Advert::listforPageArea(2, 1, getCategoryField($category, 'id'));
}

!!! Важно: вы используете $category как переменную один раз и как ассоциативный массив в другой раз. Вы не можете просто вычислить массив в строку. Я предполагаю, что ваш массив $category может содержать поле name?, так как кажется, что оно содержит поле с именем id. Вам придется использовать это имя поля в $ads[$category['field???']][] или ваша строка Advert::listforPageArea(2, 1, $category['id']); неверна.

0 голосов
/ 14 декабря 2011

Содержимое, установленное в вашем цикле, будет ограничено этим циклом.Так что он не будет использоваться в другом месте (насколько я помню).

Если вы хотите, вы можете создать переменную, такую ​​как:

//In the foreach loop
$cat_name = "whatever";
$var_name = $cat_name . "_expiryDate";

$$var_name = 5 /* Calulcate the expiry date here */;

Чтобы иметь доступ к вашим переменным в другом месте,вам нужно будет хранить значение вне цикла, например, в ассоциативном массиве.

Еще одно решение - включить дату окончания срока действия в объект Advert или предоставить метод для его получения в классе..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...