繁体   English   中英

在PHP中执行此foreach的更好方法?

[英]Better way to do this foreach in PHP?

是否有更好的方法来获得与之相同的结果?

foreach($data['report']->result_array() as $k){
    $array[] = $k['id'];
}

更好:在这种情况下,意味着更短,更易于阅读或总体上语法更好。

我是新手,欢迎编程社区的意见/建议/一般智慧!

我想不出更好的方法来实现这一目标。

当然,如果您能够更改result_array()函数,则可以引入一个新参数以仅返回id字段。 但是,我认为这会降低代码的可读性。

如果只想从$ data ['report']加载ID,我建议定义一个新的专门方法,该方法返回所有ID

如果只想从$ data ['report']的每个元素上由result_array函数返回的数据数组中提取'id'字段并将其放入一个新数组中,那么这大概和您一样高效可以得到。

您对此感到不安吗? 如果我要处理的对象/数据结构对我来说很好(尽管我永远不会将数组变量命名为“ $ array”-像$ idArray这样的名称更合适)。 就是说,我想它已经被适当地评论了,等等。

$array = array_map(function($k) { 
    return $k['id'];
}, $data['report']->result_array());

您仅限于在“循环”内执行单个操作,因此我不知道它是否符合“更好”的条件。 只是不同而已。

有些人喜欢编程的map / reduce风格,但是在PHP代码中并不是很常见,因为语法不是很好,并且匿名函数只是最近才引入的。

编辑:删除了有关速度比较的位。

这是一种更好的方法(至少我认为是更好的):

$reportIds = array();
$dataArray = $data['report']->result_array();

foreach($dataArray as $reportElement) {
    $reportIds[] = $reportElement['id'];
}

它使用了更有意义的变量名(我猜是这样),并且对所发生的事情有些冗长。 请记住,除了正确性之外,可读性比其他所有问题都重要。

当然,根据您正在执行的操作的需要,您还可以编写一种方法来仅获取id(以及result_array() )或迭代器来为您执行此操作:

class MultiDimensionalArrayIterator extends ArrayIterator {
    protected $key = '';

    public function __construct(array $array, $key) {
        $this->key = $key;
        parent::__construct($array);
    }

    public function current() {
        $data = parent::current();
        return $data[$this->key];
    }

    public function offsetGet($index) {
        $data = parent::offsetGet($index);
        return $data[$this->key];
    }

    // Implement other overrides to consistently handle iteration
}

用法:

$dataArray = $data['report']->result_array();
$iterator = new MultiDimensionalArrayIterator($dataArray, 'id');
$reportIds = iterator_to_array($iterator);

有很多可能性。 问题来了,您需要什么,其余项目需要什么...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM