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

时间:2015-06-19 11:34:42

标签: php arrays oop

我试图做的是迭代一个数组(在我的情况下是一个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布局的不同页面。

1 个答案:

答案 0 :(得分:1)

这个怎么样

<?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;