如何使用 PHP array_combine 和 for 循环添加可变数量的键值对?
How do I add variable numbers of key value pairs using PHP array_combine and for-loop?
我有一个数据库,其中存储了 20 个人口统计数据。
人口统计数据来自 csv 并存储在数组中。每个数组键都是一个占位符:d1、d2,直到 d20。传入的数据对于客户 A 可能是 [race, gender, class],对于客户 B 可能是 [income, region]。
对于两个客户端,数据库 table 将它们的值存储为 d1、d2、d3...d20。数据在插入数据库时与 clientid 相关联。
我需要为数据库编写一个插入语句 table。我需要它包括 d1...d20。总会有 20 个占位符。有些已经填满,有些不像上面的例子。
挑战是不知道会填多少
因此,我创建了一个键数组。我将其与传入的 csv 数据数组结合起来。
$demos['d01']='';
$demos['d02']='';
$demos['d03']='';
$demos['d04']='';
...
$demos['d20']='';
我产生了这个结果。
print_r($rowdata);
[1] => Array
(
[d01] => 1
[firstname] => Fred
[lastname] => Dryer
[email] => FredDryer1@email.com
[d02] => Backfield
[d03] => North
[partnerid] => 14
[d04] =>
...
[d20] =>
)
其实这就是我想要的。但是,我似乎只能通过添加 $rowdata_tmp['d04'] = ''; 手动到达那里匹配添加 d04 到 $demos_keys。当键的数量与第二个数组中的元素数量不匹配时,代码将失败。见下文。
我需要以编程方式完成此匹配。
我需要的解决方案是下面的 for 循环。为了演示目的,我在这里将它设置为从 4 开始,因为在这种情况下我知道它需要从那里开始。
我已经尝试过 $x = $place_to_start 其中 $place_to_start = 4 通过相对于传入的 csvdata 的数学得出。
但是,没有快乐。循环不起作用。 500 错误。没有帮助!
$place_to_start = 4;
foreach ($csvdata as $row) {
$rowdata_tmp = explode(',', trim($row));
$rowdata_tmp['partnerid'] = $partnerid;
$rowdata_tmp['d04'] = '';
// for ($x = 4; $x = 20; $x++) {
// if ($x <10) {
// $rowdata_tmp['d0'.$x] = '';
// } else {
// $rowdata_tmp['d'.$x] = '';
// }
// }
$rowdata[] = array_combine($demos_keys, $rowdata_tmp);
}
有人看到我的问题,因为它与代码有关吗?我知道过去可能做出了更明智的设计选择……这就是我们所在的位置。所有评论都非常感谢。
这部分for ($x = 4; $x = 20; $x++) {
会造成死循环。要在结果中包含 20,您可以使用
for ($x = 4; $x <= 20; $x++) {
你可能做的是从 20 中减去 $rowdata_tmp
中的项目数,并将 for 循环的开始设置为 $rowdata_tmp
的数量,假设来自 csv 的键不是一样。
$rowdata_tmp = explode(',', trim($row));
$nrItemsFromCsv = count($rowdata_tmp);
$nrItemsToAdd = 20 - $nrItemsFromCsv;
for ($x = $nrItemsFromCsv; $x <= $nrItemsToAdd; $x++) {
if ($x < 10) {
$rowdata_tmp['d0' . $x] = '';
} else {
$rowdata_tmp['d' . $x] = '';
}
}
print_r($rowdata_tmp);
我有一个数据库,其中存储了 20 个人口统计数据。 人口统计数据来自 csv 并存储在数组中。每个数组键都是一个占位符:d1、d2,直到 d20。传入的数据对于客户 A 可能是 [race, gender, class],对于客户 B 可能是 [income, region]。
对于两个客户端,数据库 table 将它们的值存储为 d1、d2、d3...d20。数据在插入数据库时与 clientid 相关联。
我需要为数据库编写一个插入语句 table。我需要它包括 d1...d20。总会有 20 个占位符。有些已经填满,有些不像上面的例子。
挑战是不知道会填多少
因此,我创建了一个键数组。我将其与传入的 csv 数据数组结合起来。
$demos['d01']='';
$demos['d02']='';
$demos['d03']='';
$demos['d04']='';
...
$demos['d20']='';
我产生了这个结果。
print_r($rowdata);
[1] => Array
(
[d01] => 1
[firstname] => Fred
[lastname] => Dryer
[email] => FredDryer1@email.com
[d02] => Backfield
[d03] => North
[partnerid] => 14
[d04] =>
...
[d20] =>
)
其实这就是我想要的。但是,我似乎只能通过添加 $rowdata_tmp['d04'] = ''; 手动到达那里匹配添加 d04 到 $demos_keys。当键的数量与第二个数组中的元素数量不匹配时,代码将失败。见下文。
我需要以编程方式完成此匹配。
我需要的解决方案是下面的 for 循环。为了演示目的,我在这里将它设置为从 4 开始,因为在这种情况下我知道它需要从那里开始。
我已经尝试过 $x = $place_to_start 其中 $place_to_start = 4 通过相对于传入的 csvdata 的数学得出。
但是,没有快乐。循环不起作用。 500 错误。没有帮助!
$place_to_start = 4;
foreach ($csvdata as $row) {
$rowdata_tmp = explode(',', trim($row));
$rowdata_tmp['partnerid'] = $partnerid;
$rowdata_tmp['d04'] = '';
// for ($x = 4; $x = 20; $x++) {
// if ($x <10) {
// $rowdata_tmp['d0'.$x] = '';
// } else {
// $rowdata_tmp['d'.$x] = '';
// }
// }
$rowdata[] = array_combine($demos_keys, $rowdata_tmp);
}
有人看到我的问题,因为它与代码有关吗?我知道过去可能做出了更明智的设计选择……这就是我们所在的位置。所有评论都非常感谢。
这部分for ($x = 4; $x = 20; $x++) {
会造成死循环。要在结果中包含 20,您可以使用
for ($x = 4; $x <= 20; $x++) {
你可能做的是从 20 中减去 $rowdata_tmp
中的项目数,并将 for 循环的开始设置为 $rowdata_tmp
的数量,假设来自 csv 的键不是一样。
$rowdata_tmp = explode(',', trim($row));
$nrItemsFromCsv = count($rowdata_tmp);
$nrItemsToAdd = 20 - $nrItemsFromCsv;
for ($x = $nrItemsFromCsv; $x <= $nrItemsToAdd; $x++) {
if ($x < 10) {
$rowdata_tmp['d0' . $x] = '';
} else {
$rowdata_tmp['d' . $x] = '';
}
}
print_r($rowdata_tmp);