循环未知的查询结果属性

时间:2015-06-21 00:48:26

标签: php mysql codeigniter

在CodeIgniter模型类中,给定一个返回未知表列的查询

$sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'myDatabase' AND TABLE_NAME = 'assets';";
return $this->db->query($sql)->result();

CodeIgniter文档提供了使用已知对象属性循环查询结果的示例:

foreach ($query->result() as $row)
{
   echo $row->title;
   echo $row->name;
   echo $row->body;
}

我需要使用foreach做同样的事情,但我不一定知道属性的名称(表列名称),甚至不知道有多少(就像有多少表列一样)

如果我可以使用foreach循环,那将是很好的,如

foreach($result as $row){
    for($i=0;$i<count($row);$i++){
        echo $row[$i] . "<br>";
    }
}

...但这会产生错误Cannot use object of type stdClass as array

Array

(     [0] =&gt; stdClass对象         (             [COLUMN_NAME] =&gt; as_id         )

[1] => stdClass Object
    (
        [COLUMN_NAME] => as_type
    )...(etc)

2 个答案:

答案 0 :(得分:2)

实际上,using a regular foreach loop可以迭代一个对象,就像迭代一个数组来读取键和值一样。

根据您的$query->result()数组,您可以使用嵌套foreach进行迭代:

foreach ($query->result() as $row) {
  // The object can be looped with foreach
  // using $property as the prop name and $value as the value
  foreach ($row as $property => $value) {
    echo "Property: $property, Value: $value\n";
  }
}

现在,您正在针对information_schema.columns执行已知查询,该查询返回的唯一结果列为COLUMN_NAME。因此,迭代result()并阅读COLUMN_NAME属性实际上会为您提供所需的值:

foreach ($query->result() as $row) {
  // The only column returned is COLUMN_NAME
  echo $row->COLUMN_NAME;
}

换句话说,虽然查询将返回未知数量的字符串值表示 MySQL表列名称,但查询本身返回一组未知的列 - 它总是返回名为COLUMN_NAME一个列;它本身并不是动态的。

答案 1 :(得分:1)

你现在可以使用foreach遍历数组,在第一个foreach中访问每个记录,并在其他foreach中遍历数组并获取值

foreach ($query->result() as $row)
{
   foreach($row as $column=> $value)
   {
      echo "column name is $column and its value is $value </br>";
   }
}

希望你能得到它的概念