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