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