当我使用以下代码时:
$members = array();
$members[] = array([id]=>"1", [name]=>"name") ; // mysql_fetch_array($row)
我可以像这样用树枝迭代:
{% for member in members %}
<tr><td>{member.id}</td><td>{member.name}</td></tr>
{% endfor}
但我有更多行,而且我不想将整个数组分配到内存中,这对我来说似乎是浪费资源。
那我该如何循环:
$members = array([id]=>"1", [name]=>"name");
目前似乎迭代每个数组键,而不是整个数组:
{% for member in members %}
<tr><td>{member.id}</td><td>{member.name}</td></tr>
{% endfor}
outputs :
<tr><td>1</td></tr>
<tr><td>test</td></tr>
而且我不想使用:(除非别无选择)
return array( mysql_fetch_array($data) );
答案 0 :(得分:1)
你希望在twig中迭代mysql结果集,而不是将整个东西加载到php数组中。
将第一行加载到嵌套数组中。这很有效,但当然你只能在树枝上回应第一条记录。
您正在寻找一种仅使用数组从twig获取下一行的方法。这是不可能的,因为你拥有的数组没有与mysql结果指针的连接(除了拥有第一条记录的数据)。
请注意,我没有测试过任何代码示例。
将整个内容加载到php中
如果结果集相当小,比如低于100行,你可以咬住子弹并将其完全加载到嵌套数组中并将其传递给twig。使用简单的{% for %}
循环迭代它可以没有问题。
创建生成器 [docs]
这将要求您升级到至少PHP 5.5,它引入了此功能。您的代码看起来像这样:
return array( //I'm assuming this returns data to be passed to twig
"data" => function () use ($result) {
//$result is the returned value of mysql_query
yield mysql_fetch_row($result);
},
);
然后,您可以在模板中执行{% for row in data %}
。
创建迭代器
在旧版本(例如5.3.3)上,生成器不可用。但这只是编写实现\Iterator
[docs] 接口的类的捷径。这涉及一些代码,但你可以创建一个只能使用结果指针构建的泛型类,你可以foreach
(在php中)或for
(在twig中),就像它一样数组或生成器。
切换到PDO
根据您的项目规模,这可能是最佳选择(这是我建议的那个)。开始使用PDO非常容易,当你进行查询时,它返回一个\PDOStatement
对象,该对象实现\Traversable
,这意味着你可以foreach
或{% for %}
覆盖它 - 无需编写任何包装代码。这是我从mysql_ *切换到PDO的主要原因之一(另一个是准备好的语句)。
创建树枝延伸
只是提一下这个。可能涉及最多(时间和代码)的解决方案是在树枝中创建while
标记,并且可以在结果指针上调用mysql_fetch_*
。