如何使用 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);