【问题标题】:split string into array object in php在php中将字符串拆分为数组对象
【发布时间】:2017-02-15 18:14:51
【问题描述】:

我有一个这样的字符串:“abc@gmail.com;ABC,xyz@gmail.com;XYZ”,我想转换成数组对象。我怎样才能做到这一点? 下面是示例

$noactivity_noassignedto = "abc@gmail.com;ABC,xyz@gmail.com;XYZ";
$assignedto = explode(';', $noactivity_noassignedto);
$assignedto = array((object) array("Email" => $assignedto[0], "Name" => $assignedto[1]));
$fromadd = 'some@abc.com';
$fromname = 'somename';
/*sending mail here*/
$this->init()->setsubject($sub)->addto($assignedto)->setfrom($fromadd, $fromname)->send();

【问题讨论】:

  • 你有什么问题?
  • unable split the string $noactivity_noassignedto based in ;(character) 需要将变量传递给 addto()
  • $assignedto 的期望内容是什么?
  • 两封邮件都需要发送邮件
  • 我明白,但我们不知道 $this->addto() 方法 - 如果您不知道目标代码应该是什么样子,您必须发布它的代码。跨度>

标签: php arrays string object


【解决方案1】:

试试这个代码:

$noactivity_noassignedto = "abc@gmail.com;ABC,xyz@gmail.com;XYZ";
$assignedto = explode(',', $noactivity_noassignedto);

foreach ($assignedto as $recipient) {
    $tmp = explode(';', $recipient);
    $recipients[] = (object)array("Email" => $tmp[0], "Name" => $tmp[1]);
}
$recipients = (object)$recipients;

【讨论】:

  • 我可以直接传给$this->init()->setsubject($sub)->addto($recipients)->setfrom($fromadd, $fromname)->send();这是正确的方法吗
  • 是的,但请检查 $recipient 是否具有您的 addto() 方法所需的结构。我没有看到你的方法,只是按照你的要求做了
  • $recipients = (object)$recipients; 行是不必要的,没有该行,它的格式已经正确
  • @RiggsFolly 我理解,但是如果 OP 的 addto() 方法检查类型怎么办?他要求一个对象,或者“放入数组对象”可能意味着“对象数组”? :-)
【解决方案2】:
$noactivity_noassignedto = "abc@gmail.com;ABC,xyz@gmail.com;XYZ";
$elements = explode(',', $noactivity_noassignedto);
foreach ($elements as $element) {
    $dummy = explode(';', $element);
    $assignedto[] = (object)array("Email" => $dummy[0], "Name" => $dummy[1]);
}

【讨论】:

  • 你没有仔细看@Anant
  • 这是一个数组数组,而不是具有名称属性的对象数组
  • @RiggsFolly 我假设 Anant 这么说是因为我的回答是第一个正确执行第一次爆炸的人,而不是 ';'但是 ',' 作为分隔符。
  • 这样更好,DV 已移除
【解决方案3】:

你需要两个爆炸

   $noactivity_noassignedto = "abc@gmail.com;ABC,xyz@gmail.com;XYZ";
   $assignedAll = explode(',', $noactivity_noassignedto);

   // here you can put loop to send all, for now just first
   $assignedto = explode(';', $assignedAll[0]);
   $assignedto = array((object) array("Email" => $assignedto[0], "Name" => $assignedto[1]));

【讨论】:

  • 但只有一个name-emails设置不是2
【解决方案4】:

这将生成你想要的对象数组

$noactivity_noassignedto = "abc@gmail.com;ABC,xyz@gmail.com;XYZ";
$assignedto = explode(',', $noactivity_noassignedto);

foreach($assignedto as $item) {
    list($email, $name) = explode(';', $item);
    $addresses[] = (object)['Name'=>$name, 'Email'=>$email];
}

print_r($addresses);

结果:print_r($addresses);

Array
(
    [0] => stdClass Object
        (
            [Name] => ABC
            [Email] => abc@gmail.com
        )

    [1] => stdClass Object
        (
            [Name] => XYZ
            [Email] => xyz@gmail.com
        )

)

【讨论】:

    【解决方案5】:

    你走在正确的道路上。 explode 是您正在寻找将字符串拆分为数组的内容。 给定

    $str = "abc@gmail.com;ABC";
    $arr = explode($str, ';');
    

    $arr 将是array('abc@gmail.com', 'ABC');

    我认为您的问题是您想多次调用它。为此:

    $str = "abc@gmail.com;ABC,def@gmail.com;DEF";
    $people = explode($str, ',');
    foreach ($people as $person) {
        $assigned_to = explode($person, ';');
        // rest of your code
    }
    

    【讨论】:

    • 我可以直接添加$this->init()->setsubject($sub)->addto($assignedto)->setfrom($fromadd, $fromname)->send();在你的评论之后进入forloop
    猜你喜欢
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多