我的 PHP 数组定义了键名,情况如下:
array(
'filed1'=>array(1,2,3),
'filed2'=>array(a,b,c),
'filed3'=>array(x,y,z),
);
我根据这个数组要生成 sql :
INSERT INTO `contents` (`filed1`,`filed2`,`filed3`) VALUES ((1,a,x) ,(2,b,y) ,(3,c,z) ) ;
$value_str='(';
for($i=0;$i<count( $data[ 0 ] );$i++) // 记录数
{
for($j=0;$j<count($data);$j++) // 字段数量
{
$value_str.="'".$data[$i][$j]."',";
}
}
$value_str.=')';
$filed_str='(`'.implode("`,`",array_keys($data)).'`)';
就在记录数哪里,使用了索引值,$data[0]这样的方式,结果,就出问题了!数组越界 Undefined offset: 0
定义了键名的数组,就不能用索引来取值了吗?
1
koodai OP 有没有大神顺手回复一下问题的 ^_^
|
2
koodai OP 现有方案:
``` $data_array_keys = array_keys($data); $value_str='('; for($i=0;$i<count( $data[ $data_array_keys[0] ] );$i++) // 记录数 { for($j=0;$j<count($data);$j++) // 字段数量 { $value_str.="'".$data[$i][$j]."',"; } } $value_str.=')'; $filed_str='(`'.implode("`,`", $data_array_keys ).'`)'; ``` |
3
torbrowserbridge 2017-01-14 15:23:24 +08:00
array_values
|
4
langmoe 2017-01-14 15:24:17 +08:00
for 改成 foreach ?
|
5
koodai OP 我回复的太着急了,$value_str.="'".$data[$i][$j]."',"; 这里也有问题,不过简单做下标的调换就可以 。$j 这里直接无法使用,需要根据 key 的值来取,
|
6
koodai OP |
7
koodai OP @torbrowserbridge 把键名直接去掉,新的数组只含键值,再用下标,可以!好方法
|
8
AbrahamGreyson 2017-01-14 15:29:55 +08:00 via iPhone
代码风格倒腾明白了或许能帮你看看,这大 tab 在手机上都缩进到地平线了。
|
9
koodai OP @AbrahamGreyson 不谈这个代码,简单一个问题,就问:对于有键名的数组,就不可以用索引的方式取值了?
|
10
guoguoer 2017-01-14 15:46:10 +08:00 via iPhone
|
11
mrgeneral 2017-01-14 16:23:12 +08:00
关联数组和索引数组的区别,关联数组不支持索引访问
|
12
AbrahamGreyson 2017-01-14 17:02:08 +08:00 via iPhone
@koodai 是的😽
|
13
msg7086 2017-01-14 18:01:00 +08:00 via Android
你数组里哪有 0 => ?
0 和 field1 都是索引,或者叫键。 [5] 就是 [0 => 5],所以你才能用 0 键去访问啊。 |
14
msg7086 2017-01-14 18:02:56 +08:00 via Android
你标题里说的:索引和键名,在 PHP 里是一个东西。
|
17
iyaozhen 2017-01-14 20:52:31 +08:00 via Android
实际上你这样 data 是一个 map 了,不能用下标索引了。而且楼主你这实现有点挫。且不论拼 SQL 这件事。其实你 filed 应该是确定的,没必要做 key 。 data 存成[[1,a,x] ,[2,b,y] ,[3,c,z]]不是更好?
|
18
CoderRunner 2017-01-14 21:43:41 +08:00
|
19
quericy 2017-01-14 21:50:45 +08:00
楼主的实现方式就不吐槽了.
但是单论有索引的数组,还是有些方法可以取第几个元素的 比如 array_slice , length 置为 1, 偏移量 offset 作为序号 |
20
koodai OP |
21
koodai OP @quericy thanks !
----------------------- 此外 key 会有如下的强制转换: 包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8 。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。 浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8 。 布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0 。 Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。 数组和对象不能被用为键名。坚持这么做会导致警告: Illegal offset type 。 如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。 Example #2 类型强制与覆盖示例 <?php $array = array( 1 => "a", "1" => "b", 1.5 => "c", true => "d", ); var_dump($array); ?> 以上例程会输出: array(1) { [1]=> string(1) "d" } 上例中所有的键名都被强制转换为 1 ,则每一个新单元都会覆盖前一个的值,最后剩下的只有一个 "d"。 PHP 数组可以同时含有 integer 和 string 类型的键名,因为 PHP 实际并不区分索引数组和关联数组。 ----------------------------- 这些定义,感觉很神奇! ^_^ |
22
klom303 2017-01-16 10:25:27 +08:00
其实要处理数组,不一定要套 for 循环,有一些很好用的数组函数啊,比如:
``` $data = array( 'filed1' => array(1, 2, 3), 'filed2' => array('a', 'b', 'c'), 'filed3' => array('x', 'y', 'z'), ); $result = array_map(function ($filed1, $filed2, $filed3) { return "('{$filed1}','{$filed2}','{$filed3}')"; }, $data['filed1'], $data['filed2'], $data['filed3']); echo implode(',',$result); ``` |