我有一个工作脚本,但我确信我管理数组的方法可能会更好。我已经搜索过一个解决方案但没找到,但我确信我应该使用关联数组的功能来更有效地做事。
我有两个数组,一个来自CSV文件,另一个来自数据库。我已经将CSV数组创建为数字,将DB数组创建为关联(尽管我知道PHP中的差异是模糊的)。
我正在尝试在DB数组中找到一个记录,其中一个字段中的值与CSV数组中的值匹配。两个阵列都是多维的。
在每个数组的每个记录中都有一个参考号。它在CSV数组中出现一次,可能出现在DB数组中。如果确实如此,我需要采取行动。
我目前正在做这个(简化):
$CSVarray:
('reference01', 'blue', 'small' ),
('reference02', 'red', 'large' ),
('reference03', 'pink', 'medium' )
$Dbarray:
(0 => array(ref=>'reference01',name=>"tom",type=>"mouse"),
(1 => array(ref=>'reference02',name=>"jerry",type=>"cat"),
(2 => array(ref=>'reference03',name=>"butch",type=>"dog"),
foreach ($CSVarray as $CSVrecord) {
foreach ($Dbarray as $DBrecord) {
if ($CSVarray[$numerickey] == $DBrecord['key'] {
do something with the various values in the $DBrecord
}
}
}
这太可怕了,因为数组每行数千行。
我不只是想知道匹配的值是否存在,我想从匹配的记录中检索数据,所以像'array_search'这样的函数不能做我想要的,而array_walk似乎没有比我当前更好的方法
我真正需要的是这样的(乱码):
foreach ($CSVarray as $CSVrecord) {
WHERE $Dbarray['key']['key'] == $CSVrecord[$numerickey] {
do something with the other values in $Dbarray['key']
}
}
我正在寻找一种方法来使用键(数字或关联)匹配值,而不是走数组。有人可以提供任何帮助吗?
答案 0 :(得分:2)
使用哈希映射 - 获取一个数组并将其所属记录的每个键映射到该记录。然后获取第二个数组并简单地迭代它,检查每个记录键,如果hashmap有任何设置。 关于你的例子:
foreach ($DBarray as $DBrecord){
$Hash[$record[$key]] = $DBrecord;
}
foreach ($CSVarray as $record){
if (isset($Hash[$record[$CSVkey]])){
$DBrecord = $Hash[$record[$CSVkey]];
//do stuff with $DBrecord and $CSVrecord
}
}
这个解决方案适用于O(n)而你的O(n ^ 2)...
答案 1 :(得分:0)
您也可以像这样使用foreach循环:
foreach ($record as $key => $value) {
switch($key)
{
case 'asd':
// do something
break;
default:
// Default
break;
}
}
您可能正在寻找开关:)
答案 2 :(得分:0)
将CSV加载到db中,如果可能,请使用db(而不是db array)进行检索。索引referenceid字段。