Php 在foreach循环中设置动态变量

Php 在foreach循环中设置动态变量,php,variables,foreach,Php,Variables,Foreach,我有一组要循环的类别,并将动态变量/数组设置为页面循环 我目前拥有的代码是: foreach($categories as $category) { $category_ads[] = Advert::listforPageArea(2, 1, $category['id']); } 函数根据所选类别返回广告对象 我想能够计算出每个广告的有效期,以便在其他地方使用 我正在努力解释我到底想要什么,但我只想在循环中设置自定义内容。在循环中设置的内容将限制在该循环中。所以它在其他地方不可用(

我有一组要循环的类别,并将动态变量/数组设置为页面循环

我目前拥有的代码是:

foreach($categories as $category)
{
    $category_ads[] = Advert::listforPageArea(2, 1, $category['id']);
}
函数根据所选类别返回广告对象

我想能够计算出每个广告的有效期,以便在其他地方使用


我正在努力解释我到底想要什么,但我只想在循环中设置自定义内容。

在循环中设置的内容将限制在该循环中。所以它在其他地方不可用(据我记忆所及)

如果需要,可以创建如下变量:

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

$$var_name = 5 /* Calulcate the expiry date here */;
为了能够在其他地方访问变量,需要将值存储在循环之外,例如在关联数组中


另一个解决方案是在广告对象中包含过期日期,或者公开一个方法以在类中获取它。

您正在搜索的内容称为“变量”

链接的博客条目还回答了变量范围的问题(与Geoffroy的回答相反,变量在创建它们的循环之外是有效的),并且(正确地)指出,如果不验证变量名,该方法是高度不安全的

你能改为使用数组中的数组吗<代码>$arr['cat1']['cat2']

编辑:如何使用多维数组执行此操作(请参阅)


!!!重要提示:您一次像使用变量一样使用
$category
,另一次像使用关联数组一样使用。不能简单地将数组求值为字符串。我猜您的数组
$category
可能包含一些字段
name?
,因为它似乎包含一个名为
id
的字段。您必须在
$ads[$category['field???”][
或您的行
广告::listforPageArea(2,1,$category['id')中使用该字段名不正确。

很难理解您在这里要求什么。你能用一些psedocode来解释你想要什么吗?我会用无效的代码,但希望这能解释我想要什么:foreach($categories as$category){$ad.$category['shortname']=Advert::listforPageArea(2,1,$category['id']);},这会给我一组对象,比如:$ad_business,$ad_innovation等等。这些创建变量的范围是周围的函数,而不是循环。好的,谢谢:)我不确定,一直切换到C/C++时出现问题:)谢谢。我以前发现了变量,但不知道如何使用它们。我正在尝试:$$ad\ux$类别['shortname']=广告::listforPageArea(2,1,$category['id']);但它是无效的。有什么建议吗?我的建议是删除变量,然后像Martin提到的那样使用二维数组。这将防止你的范围变得混乱,你也会知道哪些变量是可用的。你能举个例子吗?我不确定我必须使用什么语法。谢谢Martin。我的代码如下$ads=array();/。。。每个($categories as$category){如果(!array_key_存在($category['id'],$ads)){$ads[$category]=array();}$ads[$category['shortname']]]][]=广告::listforPageArea(2,1,$category['id']);}这给了我一个错误:警告:非法偏移量类型也有什么代码,您希望在注释的地方执行//这里的一些代码可能您的
$category['shortname']
是一个对象,您必须首先将其转换为字符串:
$ads[(string)$category['shortname'][=…
。希望这有帮助。
$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'));
}