Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:确定数组位置的最佳方法 我希望实现的_Php - Fatal编程技术网

PHP:确定数组位置的最佳方法 我希望实现的

PHP:确定数组位置的最佳方法 我希望实现的,php,Php,我的网站每晚都会进行API数据提取,每晚插入100000多个新条目。为了节省空间,每个字段名都位于一个单独的表中,分配的ID为每个数据集节省约1027字节,大约每晚节省2.5675MB,一年中节省不到1GB,但这一数字会增加 对于每个用户,请求一个JSON文件,其中包含要添加的112个条目。我觉得为了节省时间,最好创建一个数组,而数组中的位置就是ID,所以让我们使用一些随机的植物名称,而不是检查我的表中的每个名称ID 蔬菜随机列表 "Broccoli", "Brussels sprouts",

我的网站每晚都会进行API数据提取,每晚插入100000多个新条目。为了节省空间,每个字段名都位于一个单独的表中,分配的ID为每个数据集节省约1027字节,大约每晚节省2.5675MB,一年中节省不到1GB,但这一数字会增加

对于每个用户,请求一个JSON文件,其中包含要添加的112个条目。我觉得为了节省时间,最好创建一个数组,而数组中的位置就是ID,所以让我们使用一些随机的植物名称,而不是检查我的表中的每个名称ID

蔬菜随机列表

"Broccoli", "Brussels sprouts", "Cabbage", "Calabrese", "Carrots", "Cauliflower", "Celery", "Chard", "Collard greens", "Corn salad", "Endive", "Fiddleheads (young coiled fern leaves)", "Frisee", "Fennel"
当我通过PHP类创建insert时,我使用以下命令:

$database->bind(':veg_name', VALUE);
问题:
快速检查阵列中$x的位置的最佳方法是什么?

如果你每晚只做2.5兆,那几乎没什么。如果您在拖动它之前将其压缩,它将减少更多

如果您试图使用数组位置来匹配其他表中的某些内容,那么使用数组位置可能会变得很棘手

也就是说,每个数组都有一个数字索引,所以您可以在任何时候找到它是什么

试试这个,你会看到:

$array = array("Broccoli", "Brussels sprouts", "Cabbage", "Calabrese", "Carrots", "Cauliflower", "Celery", "Chard", "Collard greens", "Corn salad", "Endive", "Fiddleheads (young coiled fern leaves)", "Frisee", "Fennel");

var_dump(array_keys($array));
在阵列上,还可以执行以下操作:

$currentKey = array_search("carrot",$array);
这将返回给定变量的键。因此,如果在数组中循环,可以输出键(索引)并使用它执行其他操作


此外,gzip是一种压缩形式,可以使数据更小。

如果你每晚只做2.5兆,那几乎什么都不是。如果您在拖动它之前将其压缩,它将减少更多

如果您试图使用数组位置来匹配其他表中的某些内容,那么使用数组位置可能会变得很棘手

也就是说,每个数组都有一个数字索引,所以您可以在任何时候找到它是什么

试试这个,你会看到:

$array = array("Broccoli", "Brussels sprouts", "Cabbage", "Calabrese", "Carrots", "Cauliflower", "Celery", "Chard", "Collard greens", "Corn salad", "Endive", "Fiddleheads (young coiled fern leaves)", "Frisee", "Fennel");

var_dump(array_keys($array));
在阵列上,还可以执行以下操作:

$currentKey = array_search("carrot",$array);
这将返回给定变量的键。因此,如果在数组中循环,可以输出键(索引)并使用它执行其他操作


此外,gzip是一种压缩形式,可以使数据更小。

如果您有一个项目列表,例如,一个数组只包含表示您的值的字符串,您可以使用带有键值(
$users as$index=>$user
)方法的
foreach
,而不仅仅是一个
$users as$user
)方法,如下所示:

$users = ["Broccoli", "Brussels sprouts", "Cabbage", "Calabrese", "Carrots", "Cauliflower", "Celery", "Chard", "Collard greens", "Corn salad", "Endive", "Fiddleheads (young coiled fern leaves)", "Frisee", "Fennel"];

foreach( $users as $index => $name ) {
  echo "about to insert $name which is the #$index..." . PHP_EOL;
}
这将反映:

即将插入西兰花,这是#0

即将插入球芽甘蓝,这是#1

即将插入的卷心菜是#2

即将插入Calabrese,即#3

即将插入胡萝卜,这是#4

即将插入花椰菜,这是#5

即将插入芹菜,这是#6

即将插入Chard,它是#7

即将插入羽衣甘蓝,这是#8

即将插入玉米沙拉,即#9

即将插入Endive,即#10

即将插入小提琴头(年轻的卷曲蕨类叶子),这是#11

将要插入FRI,请查看哪个是#12

即将插入茴香,这是#13

此处提供的实例:


就像@m13r所问的,索引在您的情况下如何有用?

如果您有一个项目列表,例如,一个数组只包含表示您的值的字符串,您可以使用带有键值(
$users as$index=>$user
)的
foreach
方法,而不仅仅是
$users as$user
方法,如下所示:

$users = ["Broccoli", "Brussels sprouts", "Cabbage", "Calabrese", "Carrots", "Cauliflower", "Celery", "Chard", "Collard greens", "Corn salad", "Endive", "Fiddleheads (young coiled fern leaves)", "Frisee", "Fennel"];

foreach( $users as $index => $name ) {
  echo "about to insert $name which is the #$index..." . PHP_EOL;
}
这将反映:

即将插入西兰花,这是#0

即将插入球芽甘蓝,这是#1

即将插入的卷心菜是#2

即将插入Calabrese,即#3

即将插入胡萝卜,这是#4

即将插入花椰菜,这是#5

即将插入芹菜,这是#6

即将插入Chard,它是#7

即将插入羽衣甘蓝,这是#8

即将插入玉米沙拉,即#9

即将插入Endive,即#10

即将插入小提琴头(年轻的卷曲蕨类叶子),这是#11

将要插入FRI,请查看哪个是#12

即将插入茴香,这是#13

此处提供的实例:


如@m13r所问,索引在您的情况下如何有用?

作为匹配PHP中条目的替代解决方案(可能在某些时候遇到时间和/或内存问题):

总的想法是让数据库能够正常工作。它已经优化(索引结构)以使条目相互匹配

因此,按照您的示例,数据库可能有一个字段名
字段的维度表

ID | Name
---------------------------------
0  | "Broccoli"
1  | "Brussels sprouts"
2  | "Cabbage"
然后是“最终”表
facts
,其结构如下:

User_ID | Field_ID | Timestamp
现在应该插入一批新条目。为此,我们首先使用以下格式创建一个临时表
temp
,并插入所有原始条目。最后一列
字段\u ID
将暂时保持为空

User_ID | Field_Name | Timestamp | Field_ID
在下一步中,我们使用简单的SQL查询将每个字段名与其ID匹配:

UPDATE `temp` t
SET Field_ID=(SELECT Field_ID FROM fields f WHERE f.Name=t.Field_Name)
现在数据库已经完成了我们所需的映射,我们可以发出另一个查询来将行插入事实表:

INSERT INTO facts
SELECT User_ID, Field_ID, Timestamp FROM temp WHERE Field_ID IS NOT NULL
这里有一个小的副作用:我们的
temp
表中所有无法匹配的行(我们的
字段
表中没有字段名)仍然存在。因此,我们可以编写一些逻辑,将错误报告发送到某个地方,并让某人添加字段名或以其他方式修复问题

完成后,我们应该删除或至少删除trun