PHP函数只获取数组的最后一个值

时间:2017-07-17 22:29:43

标签: php arrays email variables sendgrid

好的,所以根据RamRaider,我已经包含了整个功能。我总是担心,当我把它变得更通用时,我最终会把变量不匹配或包含拼写错误,所以希望没有这些错误。

function my_custom_popular_posts_html_list( $mostpopular, $instance ){
    $output = 'https://startofwebaddress';
            $weekday = date("N")-1;
            $excerpt = ''; 
                $popularPost = get_post($mostpopular[$weekday]->id);
                $popularPostUrl = get_permalink( $popularPost->ID );
                $featuredImgUrl = get_the_post_thumbnail_url($popularPost->ID, 'full');
                $popularPostTitle = esc_html( get_the_title($popularPost) );
                $popularProduct = wc_get_product( $popularPost );
                $popularProductLowPrice = $popularProduct->get_price();
                $excerpt = get_keywords_by_id( $mostpopular[$weekday]->id ); //most popular = 0, 2nd most = 1, 3rd most = 2, etc.
                $initial = array("oldterms");
                $replace   = array("newterms");
                $excerpt = preg_replace($initial,$replace,$excerpt);
                $commonName = str_replace("+"," ",$excerpt);
            $output .= $excerpt;
            $output .= 'endofwebaddress';
        //Get Key for second input
        $First_url = $output;
        $xml = new DOMDocument();
        $ch = curl_init ($First_url); 
        curl_setopt($ch, CURLOPT_VERBOSE, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//return xml
        curl_setopt($ch, CURLOPT_HEADER, FALSE);//ignore 
        $xml->loadXML(curl_exec($ch));
        curl_close ($ch);
        $TagName1 = $xml->getElementsByTagName('TagName1')->item(0)->nodeValue;

        //Email URL
        $EmailURL = "urlthatneeds&TagName1=";
        $EmailURL .= $TagName1;
        $EmailURL .= "restofurl";

    $text=file_get_contents($EmailURL);
    $res = preg_match_all(
    "/[a-z0-9]+[_a-z0-9.-]*[a-z0-9]+@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})/i",
    $text,
    $matches
    );
      session_start();
    foreach(array_unique($matches[0]) as $email) {
    $url = 'https://api.sendgrid.com/';
    $user = 'user';
    $pass = 'password';

    $json_string = array(
      'to' => $email,
      'category' => 'most_popular',
      'asm_group_id' => '1141',
    );
    }
    $params = array(
        'api_user'  => $user,
        'api_key'   => $pass,
        'x-smtpapi' => json_encode($json_string),
        'to'        => 'example3@sendgrid.com', //This should be ignored
        'subject'   => $commonName . ' Detailed Protocols and Products.',
        'html'      => 'A whole ton of HTML',
        'text'      => 'Text Version of HTML',
        'from'      => 'me@mail.com',
      );


    $request =  $url.'api/mail.send.json';

    // Generate curl request
    $session = curl_init($request);
    // Tell curl to use HTTP POST
    curl_setopt ($session, CURLOPT_POST, true);
    // Tell curl that this is the body of the POST
    curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
    // Tell curl not to return headers, but do return the response
    curl_setopt($session, CURLOPT_HEADER, false);
    // Tell PHP not to use SSLv3 (instead opting for TLS)
    curl_setopt($session, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
    curl_setopt($session, CURLOPT_RETURNTRANSFER, true);
    // obtain response
    $response = curl_exec($session);
    curl_close($session);



    // print everything out
    print_r($response);


    }
    add_filter( 'wpp_custom_html', 'my_custom_popular_posts_html_list', 10, 2 );

    function get_keywords_by_id( $post_id ){

        // Get post data
        $the_post = get_post( $post_id );
        // Get post_content
        $the_post_id = $the_post -> post_title;

        return $the_post_id;
    }

希望我可以简化问题。 $ EmailUrl包含一个包含所有电子邮件地址的字符串。我用代码中的正则表达式解析它以获取所有电子邮件地址,并以数组形式输出。

Per RichGoldMD(感谢您的建议),我在循环之外移动了session_start(),并删除了额外的变量以直接传递电子邮件。执行此操作时,该功能只会向example3@sendgrid.com发送电子邮件。同样,如果我采用第一个'to'属性并将其从变量更改为逗号分隔列表,我会收到发送到逗号分隔列表的电子邮件。但是,当我尝试输入数组变量时,或者如果我尝试将数组变量按到逗号分隔列表中(这是我以前的那种),那么我只收到一封发送到example3@sendgrid.com的电子邮件。如果我将第一个'to'属性更改为[$ email,'myemail@mail.com'],我会收到一封发送到myemail@mail.com的电子邮件,并会将电子邮件发送到阵列中的最后一封电子邮件,但不会发送电子邮件到其他~1500个电子邮件地址。

希望这对缺乏背景更有意义和抱歉。如果有更多信息可以让它变得有用,请告诉我。如果能让它对其他人更有用,我也很高兴能让它变得更通用。

谢谢!

1 个答案:

答案 0 :(得分:0)

好的 - 我发现了问题。您的foreach循环遍历您的电子邮件数组,每次都替换$json_string值,只有最后一次迭代的值传递到$params数组。

我建议删除foreach行和end brace,然后替换$ json_string:

$json_string = array(
      'to' => array_unique($matches[0]),
      'category' => 'most_popular',
      'asm_group_id' => '1141',
    );

即:

$res = preg_match_all(
    "/[a-z0-9]+[_a-z0-9.-]*[a-z0-9]+@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,4})/i",
    $text,
    $matches
    );
      session_start();
    // foreach(array_unique($matches[0]) as $email) { <-- Removed foreach
    $url = 'https://api.sendgrid.com/';
    $user = 'user';
    $pass = 'password';

    $json_string = array(
      'to' => array_unique($matches[0]),  // <-- Corrected "to"
      'category' => 'most_popular',
      'asm_group_id' => '1141',
    );
    // } <-- Removed brace
    $params = array(....

---------以前的答案如下-----

肯定将session_start移出循环(这不是问题,但在任何情况下它都不属于循环)。

如果api需要一个数组,请使用implode删除该行,然后直接传递$ email,而不是将其按到$ emailAddresses中。

implode语句产生一个字符串,但是你的注释表明需要一个数组。

foreach(array_unique($matches[0]) as $email) {         
  $url = 'https://api.sendgrid.com/';
  $user = 'User'; 
  $pass = 'Password'; 
  $json_string = array(
    'to' => $email, 
    'category' => 'my_category',
    'asm_group_id' => '1234', 
  );

...