向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)'};
}