我需要有关如何在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;
}
答案 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)
PHP有array_combine函数
答案 2 :(得分:0)
忽略问题的标题,并专注于提出的问题。
目前,它正在将用户添加到正确的列表中,但每个列表会发送一封电子邮件确认,而不是在一封电子邮件中合并所有订阅的列表。
目前您在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];
}
}