PHP 的数组定义了键名,就不能使用索引了吗?

2017-01-14 15:08:54 +08:00
 koodai

场景:

我的 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

SO:

定义了键名的数组,就不能用索引来取值了吗?

4817 次点击
所在节点    PHP
23 条回复
koodai
2017-01-15 00:42:03 +08:00
@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 实际并不区分索引数组和关联数组。
-----------------------------
这些定义,感觉很神奇! ^_^
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);
```
koodai
2017-01-16 15:11:32 +08:00
@klom303 十万个赞!我以前对 array_map 有用过,但是没有这么用过。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/334580

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX