从对象 - PHP 在数组迭代中调用方法


Calling a method on array iteration, from an object - PHP

我想做的是遍历一个数组(在我的例子中是MySql结果),并输出它,但也同时对数据做其他事情。

使用过程方法执行此操作很容易 - 只需将其放在foreach循环中即可。

但是,我想知道是否有一种方法可以将其集成到对象中。

因此,例如,我想将第一个字段放入会话中,我可以这样做:

<?php
    class MyClass {
        public $myArray=array();
        public function __construct() {
            //..
            //Mysql query as $stmt
            //..
            $this->myArray=$stmt->fetchAll(PDO::FETCH_ASSOC);
        }
    }
    $obj=new MyClass;
    $i=0;
    foreach($obj->myArray as $row) {
        ?>
            <!-- Output HTML formatted data -->
        <?
        $_SESSION[$i]=$row['firstfield'];
        $i++;
    }
?>

但是,这会把任务从课堂上拿走。

我可以在类中放置一个 foreach 循环,如下所示:

<?php
    class MyClass {
        public $myArray=array();
        public function __construct() {
            //..
            //Mysql query as $stmt
            //..
            $this->myArray=$stmt->fetchAll(PDO::FETCH_ASSOC);
            $i=0;
            foreach($this->myArray as $row) {
                $_SESSION[$i]=$row['firstfield'];
                $i++;
            }
        }
    }
    $obj=new MyClass;
    foreach($obj->myArray as $row) {
        ?>
            <!-- Output HTML formatted data -->
        <?
    }
?>

但是,现在我们在同一个数据集上有 2 个循环。将完成相同任务的时间加倍。

有没有办法创建一个方法在数组循环时做某事?有效地使数据集只需要循环一次......

编辑

另外,忘了提,我无法在对象中构建 HTML 的原因是因为它将用于具有不同 HTML 布局的不同页面。

这个

怎么样

<?php
    class MyClass {
        public $myArray=array();
        public $htm = NULL;
        public function __construct(&$format=NULL) {
            //..
            //Mysql query as $stmt
            //..
            $this->myArray=$stmt->fetchAll(PDO::FETCH_ASSOC);
            $i=0;
            foreach($this->myArray as $row) {
                switch ($format) {
                  case 'Page1' :
                     $this->htm .= $this->format1($row);
                     break;
                  case 'Page2' :
                     $this->htm .= $this->format2($row);
                     break;
                  default:
                     $this->htm .= $this->format_default($row);
                }
                $_SESSION[$i]=$row['firstfield'];
                $i++;
            }
        }
        private function format1($row) {
           return // formatted html
        }
        private function format2($row) {
           return // formatted html
        }
        private function format_default($row) {
           return // formatted html
        }
    }
    $obj=new MyClass('Page1');
    echo $obj->htm;
?>

或者,您可以根据所需格式使用任意数量的子类对 MyClass 进行子类化。

class myBaseClass {
    public $myArray=array();
    public function __construct() {
        //..
        //Mysql query as $stmt
        //..
        $this->myArray=$stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}
class format1Class extends myBaseClass
{
    public $htm;
    public function __construct() {
        parent::_construct();
        $i=0;
        foreach($this->myArray as $row) {
            $this->htm .= // format specific to this class
            $_SESSION[$i]=$row['firstfield'];
            $i++;
        }
    }
}
class format2Class extends myBaseClass
{
    public $htm;
    public function __construct() {
        parent::_construct();
        $i=0;
        foreach($this->myArray as $row) {
            $this->htm .= // format specific to this class
            $_SESSION[$i]=$row['firstfield'];
            $i++;
        }
    }
}

现在,根据您在任何脚本中所需的格式,您可以实例化所需的类。

$obj = new format2Class();
echo $obj->htm;