Twig遍历非嵌套数组(mysql_fetch_array)

时间:2014-01-03 21:59:58

标签: arrays loops twig

当我使用以下代码时:

$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) );

1 个答案:

答案 0 :(得分:1)

你的问题,据我了解

你希望在twig中迭代mysql结果集,而不是将整个东西加载到php数组中。

您尝试了什么

将第一行加载到嵌套数组中。这很有效,但当然你只能在树枝上回应第一条记录。

您正在寻找一种仅使用数组从twig获取下一行的方法。这是不可能的,因为你拥有的数组没有与mysql结果指针的连接(除了拥有第一条记录的数据)。

可能的解决方案

请注意,我没有测试过任何代码示例。

  1. 将整个内容加载到php中
    如果结果集相当小,比如低于100行,你可以咬住子弹并将其完全加载到嵌套数组中并将其传递给twig。使用简单的{% for %}循环迭代它可以没有问题。

  2. 创建生成器 [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 %}

  3. 创建迭代器
    在旧版本(例如5.3.3)上,生成器不可用。但这只是编写实现\Iterator [docs] 接口的类的捷径。这涉及一些代码,但你可以创建一个只能使用结果指针构建的泛型类,你可以foreach(在php中)或for(在twig中),就像它一样数组或生成器。

  4. 切换到PDO
    根据您的项目规模,这可能是最佳选择(这是我建议的那个)。开始使用PDO非常容易,当你进行查询时,它返回一个\PDOStatement对象,该对象实现\Traversable,这意味着你可以foreach{% for %}覆盖它 - 无需编写任何包装代码。这是我从mysql_ *切换到PDO的主要原因之一(另一个是准备好的语句)。

  5. 创建树枝延伸
    只是提一下这个。可能涉及最多(时间和代码)的解决方案是在树枝中创建while标记,并且可以在结果指针上调用mysql_fetch_*