簡體   English   中英

從對象調用數組迭代方法 - 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM