PHP在foreach循环中组合了两个数组

时间:2016-02-10 16:57:43

标签: php arrays foreach

我需要有关如何在foreach循环中组合两个数组的指导。我有一个复选框列表,可以将用户添加到相应的列表中。

使用以下方法将我的复选框作为数组抓取:

<input type="checkbox" name="checkbox_list[]" value="Austin Metro">
<input type="checkbox" name="checkbox_list[]" value="Central Austin">
<input type="checkbox" name="checkbox_list[]" value="Georgetown">
...

这是我的循环:

foreach($_POST['checkbox_list'] as $check) {

$myValues = array('Austin Metro','Central Austin','Georgetown','Lake Travis | Westlake','Leander | Cedar Park','Northwest Austin','Round Rock | Pflugerville | Hutto','San Marcos | Buda | Kyle','Southwest Austin','DFW Metro','Frisco','Grapevine | Colleyville | Southlake','McKinney','Plano','Houston Metro','Conroe | Montgomery','Cy-Fair','Katy','Pearland | Friendswood','Spring | Klein','Sugar Land | Missouri City','Tomball | Magnolia','The Woodlands');
$myIds = array('3','4','5','6','7','8','9','10','11','25','12','13','14','15','24','16','17','18','19','20','21','23','22');

 if (isset($check) && array_search($check, $myValues) !== false){
    $index = array_search($check, $myValues);
    $indeed_mail->indeed_wysija_subscribe( $myIds[$index], $email );
 }
}

目前,它正在将用户添加到正确的列表中,但每个列表会发送一封电子邮件确认,而不是在一封电子邮件中合并所有订阅的列表。(换句话说,如果用户选择&#34; Austin&#34;&amp;& #34;休斯顿&#34;列表,它将收到一封电子邮件,用于&#34; Austin&#34;以及一封电子邮件用于&#34;休斯顿&#34;)

有关如何修复的任何建议?谢谢!

以下是添加订阅者并发送电子邮件确认的功能:

public function indeed_wysija_subscribe( $listId, $e_mail, $first_name='', $last_name='' ){
        $user_data = array(
                'email' => $e_mail,
                'firstname' => $first_name,
                'lastname' => $last_name);
        $data = array(
                'user' => $user_data,
                'user_list' => array('list_ids' => array($listId))
        );
        $helper = &WYSIJA::get('user', 'helper');
        if($helper->addSubscriber($data)) return 1;
        else return 0;
}

3 个答案:

答案 0 :(得分:1)

您应该在循环外定义带有复选框名称/ ID的数组,并为它们使用更合适的结构:

$map = array (
  3 => 'Austin Metro',
  4 => 'Central Austin',
  5 => 'Georgetown',
  6 => 'Lake Travis | Westlake',
  7 => 'Leander | Cedar Park',
  8 => 'Northwest Austin',
  9 => 'Round Rock | Pflugerville | Hutto',
  10 => 'San Marcos | Buda | Kyle',
  11 => 'Southwest Austin',
  25 => 'DFW Metro',
  12 => 'Frisco',
  13 => 'Grapevine | Colleyville | Southlake',
  14 => 'McKinney',
  15 => 'Plano',
  24 => 'Houston Metro',
  16 => 'Conroe | Montgomery',
  17 => 'Cy-Fair',
  18 => 'Katy',
  19 => 'Pearland | Friendswood',
  20 => 'Spring | Klein',
  21 => 'Sugar Land | Missouri City',
  23 => 'Tomball | Magnolia',
  22 => 'The Woodlands',
);

现在您甚至可以完全删除循环并继续使用此代码:

// take from map only those entries that have been checked:
$checks = array_intersect($map, $_POST['checkbox_list']);
// pass the IDs of those values to the emailing class:
$indeed_mail->indeed_wysija_subscribe( array_keys($checks), $email );

您现在需要调整 really_wysija_subscribe 以便它可以处理数组。只有一行可以改变:

            'user_list' => array('list_ids' => $listId)

请注意array($listId)只变为$listId,因为该参数现在已经是一个数组。

答案 1 :(得分:0)

答案 2 :(得分:0)

忽略问题的标题,并专注于提出的问题。

  

目前,它正在将用户添加到正确的列表中,但每个列表会发送一封电子邮件确认,而不是在一封电子邮件中合并所有订阅的列表。

在将用户ID传递给订阅功能之前,您需要整理所选的用户ID。

目前您在foreach循环indeed_wysija_subscribe内调用了订阅函数foreach($_POST['checkbox_list'] as $check) {

您需要将订阅调用移到循环外部并传入$listId数组。

这可能需要您修改indeed_wysija_subscribe函数以支持该阵列。或者库中可能还有其他功能。

我不确定图书馆的内容是什么。

此外,您可以更直接地执行城市名称数字ID 之间的映射。

$myValues = array('Austin Metro','Central Austin','Georgetown');
$myIds = array('3','4','5','6');
$cityToIdMap = array(
    'Austin Metro'=>'3',
    'Central Austin'=>'4',
    'Georgetown'=>'5'
);

$subscriberIds = array();
foreach($_POST['checkbox_list'] as $check) {
    if(!empty($check) && isset($cityToIdMap[$check])){
         $subscriberIds[] = $cityToIdMap[$check];
    }
}