
我的 PHP 数组定义了键名,情况如下:
array( 'filed1'=>array(1,2,3), 'filed2'=>array(a,b,c), 'filed3'=>array(x,y,z), ); 我根据这个数组要生成 sql :
INSERT INTO `contents` (`fild1`,`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 /div> 你标题里说的:索引和键名,在 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); ``` |