PHP:确定阵列中位置的最佳方法

时间:2017-07-31 09:07:28

标签: php

我希望实施的内容

我的网站每晚进行一次API数据获取,每晚插入100,000多个新条目。为了节省空间,每个字段名称都在一个单独的表中,分配的ID每个数据集大约节省1,027个字节,大约每晚2.5675MB,一年内不到一千兆字节,但是这会增加。

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

蔬菜随机清单

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

当我通过PHP类创建插入时,我使用以下内容;

$database->bind(':veg_name', VALUE);

问题

快速检查数组中$x位置的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

如果你只做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是一种压缩形式,可以使您的数据更小。

答案 1 :(得分:1)

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

一般的想法是让数据库工作。它已经过优化(索引结构)以匹配条目。

因此,根据您的示例,数据库可能具有字段名称fields的维度表:

ID | Name
---------------------------------
0  | "Broccoli"
1  | "Brussels sprouts"
2  | "Cabbage"

然后是" final"表facts,其结构如下:

User_ID | Field_ID | Timestamp

现在应该插入一批新条目。为此,我们首先使用以下格式创建临时表temp并插入所有原始条目。最后一列Field_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表中无法匹配的所有行(我们的fields表中没有字段名称)仍然可用那里。因此,我们可以编写一些逻辑来在某处发送错误报告,并让某人添加字段名称或以其他方式解决问题。

完成后,我们应该删除或至少截断temp表,为下一夜的迭代做好准备。

小评:这里的查询仅仅是示例。您可以在一个查询中执行映射并插入到facts表中,但是您将失去"无法匹配的"条目或必须重做工作。

现在重做工作可能不是问题,但是你说未来的参赛作品数量会增加,所以这可能会成为一个问题。

答案 2 :(得分:0)

如果您有一个项目列表,例如一个只包含代表您的值的字符串的数组,您可以使用foreach使用键值($users as $index => $user)方法,而不仅仅使用$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 ...

     

即将插入#3的Calabrese

     

即将插入#4 ...

的胡萝卜      

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

     

即将插入Celery,即#6 ...

     

即将插入Chard,即#7 ...

     

即将插入#8 ...

的Collard果岭      

即将插入玉米沙拉,这是#9 ...

     

即将插入Endive,即#10 ...

     

即将插入#11 ...

的Fiddleheads(年轻的卷曲蕨叶)      

即将插入Frisee,即#12 ......

     

即将插入#13 ...

的Fennel

此处提供实时示例:https://repl.it/Jpwk

就像@ m13r问的那样,索引如何在你的情况下有用?