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:

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

4634 次点击
所在节点    PHP
23 条回复
koodai
2017-01-14 15:17:44 +08:00
有没有大神顺手回复一下问题的 ^_^
koodai
2017-01-14 15:20:56 +08:00
现有方案:
```
$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 ).'`)';
```
torbrowserbridge
2017-01-14 15:23:24 +08:00
array_values
langmoe
2017-01-14 15:24:17 +08:00
for 改成 foreach ?
koodai
2017-01-14 15:25:46 +08:00
我回复的太着急了,$value_str.="'".$data[$i][$j]."',"; 这里也有问题,不过简单做下标的调换就可以 。$j 这里直接无法使用,需要根据 key 的值来取,
koodai
2017-01-14 15:27:40 +08:00
@langmoe 还有个计数的功能。
如果使用 foreach ,可以先循环字段名,然后循环字段的值。

就问题还存在,用了键名,就无法用下标了吗?以前都没注意过(⊙﹏⊙)b
koodai
2017-01-14 15:29:01 +08:00
@torbrowserbridge 把键名直接去掉,新的数组只含键值,再用下标,可以!好方法
AbrahamGreyson
2017-01-14 15:29:55 +08:00
代码风格倒腾明白了或许能帮你看看,这大 tab 在手机上都缩进到地平线了。
koodai
2017-01-14 15:36:21 +08:00
@AbrahamGreyson 不谈这个代码,简单一个问题,就问:对于有键名的数组,就不可以用索引的方式取值了?
guoguoer
2017-01-14 15:46:10 +08:00
@koodai 我的理解, php 里没有把数组和字典没分开。键值对的字典,需要用键去访问。在 php 里如果刚好键是从 0 开始的数字,就是数组了。

所以用 foreach 更简单一致。
mrgeneral
2017-01-14 16:23:12 +08:00
关联数组和索引数组的区别,关联数组不支持索引访问
AbrahamGreyson
2017-01-14 17:02:08 +08:00
@koodai 是的😽
msg7086
2017-01-14 18:01:00 +08:00
你数组里哪有 0 => ?
0 和 field1 都是索引,或者叫键。
[5] 就是 [0 => 5],所以你才能用 0 键去访问啊。
msg7086
2017-01-14 18:02:56 +08:00
你标题里说的:索引和键名,在 PHP 里是一个东西。
jswh
2017-01-14 18:21:27 +08:00
@koodai 是的。
还有个坑,索引比如 0 和数字字符串键名比如‘ 0 ’ 是一个东西,不做区分
jswh
2017-01-14 18:23:32 +08:00
@jswh 虽然实现上有些不一样,但理解上,你就是没有键的数组理解成所有键都是'0','1', '2', '3'就好了
iyaozhen
2017-01-14 20:52:31 +08:00
实际上你这样 data 是一个 map 了,不能用下标索引了。而且楼主你这实现有点挫。且不论拼 SQL 这件事。其实你 filed 应该是确定的,没必要做 key 。 data 存成[[1,a,x] ,[2,b,y] ,[3,c,z]]不是更好?
CoderRunner
2017-01-14 21:43:41 +08:00
文档里已经解释的很详细了
http://php.net/manual/zh/language.types.array.php
quericy
2017-01-14 21:50:45 +08:00
楼主的实现方式就不吐槽了.
但是单论有索引的数组,还是有些方法可以取第几个元素的
比如 array_slice , length 置为 1, 偏移量 offset 作为序号
koodai
2017-01-15 00:41:12 +08:00
@msg7086 感谢,是自己学艺不精,以前真没认真考虑过;
@jswh 握手握手,感谢,可能跟其他语言的使用习惯有点混淆了。
@iyaozhen 只是一个 BAE 上的 php-worker 单文件抓取工具,场景单一相对来说不想复杂化,全手工实现一个小工具而已,可能在其他环境下这做法确实很挫;另外, filed 这里确实是固定的,但是正则匹配出来的东西,就是我给出的样子,没有再做加工;

@quericy 感觉你的方法更加复杂了,,,对于一个百十行左右完整抓取、保存的小工具来说,我喜欢简单粗暴。 如果不在乎繁复,循环解千愁,也不是一定要取索引,只是偶然遇到这个问题,感觉有点奇葩。

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

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

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

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

© 2021 V2EX