向php数组添加键

向php数组添加键,php,codeigniter,Php,Codeigniter,我正在尝试构建一个数组,用于输入图形。我使用以下代码: $rows = $this->Website_model->getGraphDataPositives(); $_rows = array(); $i = 0; foreach ($rows as $key => $row) { foreach ($row as $column => $value) { $_rows[$i]['x'] = $value; $_r

我正在尝试构建一个数组,用于输入图形。我使用以下代码:

$rows = $this->Website_model->getGraphDataPositives();      

$_rows = array();

$i = 0;
foreach ($rows as $key => $row) {
    foreach ($row as $column => $value) {
        $_rows[$i]['x'] = $value;
        $_rows[$i]['y'] = $value;
        $i++;
    }
}   
这将导致以下响应:

array(48) {
  [0]=>
  array(2) {
    ["x"]=>
    string(7) "3283581"
    ["y"]=>
    string(7) "3283581"
  }
  [1]=>
 array(2) {
    ["x"]=>
    string(10) "2013-10-16"
    ["y"]=>
    string(10) "2013-10-16"
  }
所以现在还不好。。它应该说:

array(48) {
  [0]=>
  array(2) {
    ["x"]=>
    string(7) "3283581"
    ["y"]=>
    string(7) "2013-10-16"
  }
  [1]=>
  array(2) {
    ["x"]=>
    string(10) "1512116"
    ["y"]=>
    string(10) "2013-10-17"
  }
谁能告诉我为了获得正确的输出需要调整什么

/////////////////////////////////

这是$rows中的内容(输出的一部分)


如果我从SQL中知道列名会更容易,但下面是:

$rows = $this->Website_model->getGraphDataPositives();      

$_rows = array();

foreach ($rows as $row) {
    $_rows[] = array(
        'x'=>$row['x-column-name-here'],
        'y'=>$row['y-column-name-here']
    );
}   

你的例子有点基本,但我认为这应该解决它的问题:

foreach ($rows as $key => $row) {
    foreach ($row as $column => $value) {
        $_rows[$key][$column%2==0?'x':'y'] = $value;
    }
}  

如果您使用的是PDO::FETCH_NUM,即您的$行将被数字索引。

我认为这里的第一步是修复Codeigniter模型的输出数组。您是否创建了:

$rows = $this->Website_model->getGraphDataPositives();
如果是这样,您应该能够轻松地进入函数并更改select语句的输出

如果在函数getGraphDataPositives()中找到“SUM(正值)”和“DATE(stamp)”,请将其更改为以下内容(粗略示例,我不知道该函数的外观):

现在,您可以这样运行它:

$rows=$this->Website_model->getgraphdata positives()

$\行=数组()

还请注意,我删除了$I=0和$I++并将$key替换为$I。那样容易多了

让我知道这是否有帮助

编辑:我不小心保留了第二个$_行[$I][$column]=$value;在那里;这已经不需要了。您只需要一个,并且您设置它的方式将两个条目设置为相同的值

编辑2:只是想注意上面的例子可能不是最好的选择,最好的选择是提供更多的描述别名

SUM(positive) AS positive
DATE(stamp) AS timestamp
然后设置如下值:

foreach ($rows as $i => $row) {
  $_rows[$i]['x'] = $row->positive;
  $_rows[$i]['y'] = $row->timestamp;
}
无论哪种选择都会奏效,第一种选择只是简单一点

foreach ($rows as $key => $row) {
    // here $key is index, $row is the object
    foreach ($row as $column => $value) {
        // here $column will be "SUM(positive)" and the value will be 3283581
        // for the first iteration. Since both are assigned $value
        // $_rows[$i]['x'] and $_rows[$i]['y'] will be identical
        $_rows[$i]['x'] = $value;
        $_rows[$i]['y'] = $value;
        $i++;
    }
} 
如果只使用定义的对象列,则应该可以:

foreach ($rows as $row) {
    $_rows[$i]['x'] = $row->{'SUM(positive)'};
    $_rows[$i]['y'] = $row->{'DATE(stamp)'};
} 

您也没有使用$key,所以最好也去掉它。

您能给我们看看
$rows
中有什么吗?为什么不试试
打印
$rows和/或$row
?这可能会有帮助。你的结果很有意义,因为你给x和y赋值相同。你是说$_行[$i]['x']=$column;您好,请使用
$key
变量而不是
$i
,模型(在Codeigniter概念中)应返回对象数组或纯数组,以便下次将其从
0索引到inf
,在问题标题中添加“Codeigniter”会有所帮助。例如,“如何在Codeigniter中向PHP数组添加键。”至少您标记了Codeigniter,这很好。它只输出x值。。不是y值,这也不是一个好例子。这是一种可怕的做法$列是实际的列名,而不是整数。但这太复杂了;即使要这样做,在将“$column%2==0?'x':'y'”标记为键之前,也要将其设置为单独的变量。对不起,我直到现在才意识到这是一个特定于codeIgniter的问题。否则,它将取决于查询的运行方式和/或数据库的设置方式。这将导致错误:致命错误:无法将stdClass类型的对象用作数组,因为codeigniter将它们生成为对象,因此它实际上是$row->x-column-name-here。根据添加到第一篇文章的$rows的输出,它无论如何都不会工作,因为该值包含特殊字符。foreach()将遍历对象,因此foreach()将输出$row中的列//这就是解决方案。将我的模型更改为x和y值,并将控制器零件更改为您的解决方案,可以提供正确的输出。非常感谢你的帮助!谢谢如果这有效,你应该接受答案。另一种选择也是将值更改为其他值,因此,例如,如果您计划将其用于其他值,则最好不要使用“x”和“y”,而是使用“正值”和“戳记”,并以不同的方式设置值。这是最简单的方法,可以设置您想要的值。我更新了原始答案以反映这一点。无论哪种方式,您都应该使用别名,因为它更易于阅读、使用和记忆。很高兴我能帮上忙。我不确定这样使用物体是否可行。我知道我可以创建一个变量,比如$pos=SUM(正数),然后执行$row->$pos,所以加上一个。不过,更好的选择是简单地为它们添加一个更具描述性的别名。我同意大多数情况,但据我所知,该方法是解析一个文件或抽象地分配密钥的东西。有时候你不能完全控制数据的显示方式,所以知道字符串文本对象键是很有用的。是的,这就是为什么我给了你一个加号,知道它是否解析文件或类似的东西非常有用,并且有一些特殊的字符通常不能作为对象使用。设置别名是更好的选择,但并非在所有情况下都有效。
foreach ($rows as $i => $row) {
  $_rows[$i]['x'] = $row->positive;
  $_rows[$i]['y'] = $row->timestamp;
}
foreach ($rows as $key => $row) {
    // here $key is index, $row is the object
    foreach ($row as $column => $value) {
        // here $column will be "SUM(positive)" and the value will be 3283581
        // for the first iteration. Since both are assigned $value
        // $_rows[$i]['x'] and $_rows[$i]['y'] will be identical
        $_rows[$i]['x'] = $value;
        $_rows[$i]['y'] = $value;
        $i++;
    }
} 
foreach ($rows as $row) {
    $_rows[$i]['x'] = $row->{'SUM(positive)'};
    $_rows[$i]['y'] = $row->{'DATE(stamp)'};
}