【问题标题】:Filtering an array result in a for each loop在每个循环中过滤数组结果
【发布时间】:2017-02-27 17:08:03
【问题描述】:

我有这段代码可以从文件中创建我的数组:

            <?php
            $servers = array();
            $handle = @fopen("data/data.txt", "r");

            if ($handle) {
                while (($buffer = fgets($handle)) !== false) {
                    $line = explode("|", $buffer);
                    $servers[] = array(
                        "name" => $line[0],
                        "ip" => $line[1],
                        "type" => $line[2],
                    );
                }

                fclose($handle);
            }
            ?>

然后我有这个代码来显示数组:

                    <?php           
                foreach ($servers as $name => $servers): ?>
                            <td style="width:340px;">&nbsp;<?php echo $servers['name']; ?></td>
                            <td style="width:240px;"><?php echo $servers['ip']; ?></td>
                        </tr>
                <?php endforeach; ?>

这是数组示例:

Array(
[0] => Array
    (
        [name] => aaa
        [ip] => 123
        [type] => good
    )

[1] => Array
    (
        [name] => bbb
        [ip] => 345
        [type] => good
    )
)

假设我需要用数组类型过滤结果是好的, 我正在尝试使用此代码,但它只返回最后一个数组:

                    <?php           
                foreach ($servers as $name => $servers): ?>
                    <?php if($servers['type']=="good"){?>
                            <td style="width:340px;">&nbsp;<?php echo $servers['name']; ?></td>
                            <td style="width:240px;"><?php echo $servers['ip']; ?></td>
                        </tr>
                    <?php } ?>
                <?php endforeach; ?>

【问题讨论】:

    标签: php arrays foreach filter


    【解决方案1】:

    错误出现在 foreach 循环中的变量名中(使用 $server 而不是 $serves,因为 $servers 已经存在并包含您的数据)

     <?php foreach ($servers a $server): ?>
               <?php if($server['type']=="good"){?>
                    <tr>
                        <td style="width:340px;">&nbsp;<?php echo $server['name']; ?></td>
                        <td style="width:240px;"><?php echo $server['ip']; ?></td>
                    </tr>
               <?php } ?>
        <?php endforeach; ?>
    

    编辑 1

    过滤数组,然后打印

    <?php
        //Filter the array
        $goodValues = array_filter($servers, function($e){
            return $e['type'] == "good";
            //Use this to be sure
            //return strtolower($e['type']) == "good";
        });
    
        //Print the values
        foreach ($goodValues as $value):  ?>
            <tr>
                <td style="width:340px;">&nbsp;<?php echo $value['name']; ?></td>
                <td style="width:240px;"><?php echo $value['ip']; ?></td>
            </tr> 
       <?php endforeach; ?>
    

    【讨论】:

    • 你能发布完整的 html 表格吗,我想你错过了标签 trtd
    • 如果我删除了我的过滤器代码: 我所有的数组都显示正常.. 他们的任何过滤我的数组的其他方法?
    • 我使用array_filter添加了一个替代答案
    【解决方案2】:

    由于这只是数字数组,并且您没有在循环主体内的任何地方使用密钥,因此您不需要使用 as $key =&gt; $value 并且只需 as $value 就足够了。还要注意不同的变量名称。

    <?php foreach ($servers as $server): ?>
        <?php if($server['type']=="good"){?>
            <tr>
                <td style="width:340px;">&nbsp;<?php echo $server['name']; ?></td>
                <td style="width:240px;"><?php echo $server['ip']; ?></td>
            </tr>
        <?php } ?>
    <?php endforeach; ?>
    

    【讨论】:

    • 我试过了,但输出还是一样。。只返回最后一个数组
    猜你喜欢
    • 2017-12-24
    • 1970-01-01
    • 2013-01-06
    • 2014-02-13
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多