如何使用数组创建消息字符串?

时间:2017-10-31 00:53:10

标签: php multidimensional-array

我需要创建一个带有多维数组的函数,并将其子数组数据转换为具有特定结构的字符串。

我有这个数组:

  array(2) {
  [257]=>
  array(5) {
    ["recaudacion"]=>
    string(10) "2017-10-07"
    ["Contribuyentes Locales,Activid. Especiales y Salas de Recreacion"]=>
    string(10) "2017-10-16"
    ["Contribuyentes Convenio Multilateral"]=>
    string(10) "2017-10-13"
    ["Regimen simplificado"]=>
    string(10) "2017-10-00"
    ["Declaracion Jurada Fiscal 2016 Contibuyentes Locales"]=>
    string(10) "2017-10-00"
  }
  [258]=>
  array(3) {
    ["Impuestos de Sellos"]=>
    string(10) "2017-10-10"
    ["Declaracion Jurada anual 2016 Contribuyentes de convenio multilateral"]=>
    string(10) "2017-10-00"
    ["Recategorizacion cuatrimestral regimen simplificado"]=>
    string(10) "2017-10-00"
  }
}

我希望像:

Array (
    257=>"recaudacion Vence: 2017-10-07

          Contribuyentes Locales,Activid. Especiales y Salas de Recreacion Vence: 2017-10-00

          Contribuyentes Convenio Multilateral Vence: 2017-10-00

          Regimen simplificado Vence: 2017-10-00

          Declaracion Jurada Fiscal 2016 Contibuyentes Locales Vence: 2017-10-00",
    258=>"Impuestos de Sellos Vence: 2017-10-10

          Declaracion Jurada anual 2016 Contribuyentes de convenio multilateral Vence: 2017-10-00

          Recategorizacion cuatrimestral regimen simplificado Vence: 2017-10-00"
)

我的代码在这里:

function crearMailDeVencimientos($idPerfil, $impuestosDelPerfil){
    $datos = getPerfilData($idPerfil);
    $mail = "impuestos de: ".$datos[0]['nombre'];
    $destinatario = $datos[0]['email'];

    foreach ($impuestosDelPerfil as $impuesto) {
        $keys = key($impuestosDelPerfil);
        $mail .= "\n".$keys;
        $mail .= " Vence: ".$impuesto;
    }
    return $mail;
    return $destinatario;
}

function enviarMail(){
    $impuestosPorPerfil = filtrarImpuestos();
    foreach ($impuestosPorPerfil as $idPerfil => $impuestosDelPerfil) {
        $mail = crearMailDeVencimientos($idPerfil, $impuestosDelPerfil);
        $destinatario = crearMailDeVencimientos($idPerfil, $impuestosDelPerfil);
        $correo = "email@example.com";
        $asunto = "Vencimientos del mes actual";
        $headers = "From: [redacted]"." <".$correo.">\r\n";
        $headers .= "MIME-Version: 1.0\r\n";
        $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

        // mail($destinatario,$asunto,$mail,$headers);
        echo '<div class="enviado">Enviado</div>';
   }

首先,我使用crearMailDeVencimientos创建消息,然后使用每条消息向每封邮件(每个ID)发送一封电子邮件。 $datos包含发送给它的名称和邮件。

2 个答案:

答案 0 :(得分:1)

您可以使用此自定义函数来构建所需的数据结构,而无需使用条件。

代码:(Demo

$array=[
    257 => [
        "recaudacion" => "2017-10-07",
        "Contribuyentes Locales,Activid. Especiales y Salas de Recreacion" => "2017-10-16",
        "Contribuyentes Convenio Multilateral" => "2017-10-13",
        "Regimen simplificado" => "2017-10-00",
        "Declaracion Jurada Fiscal 2016 Contibuyentes Locales" => "2017-10-00"
    ],
    258=> [
        "Impuestos de Sellos"=>"2017-10-10",
        "Declaracion Jurada anual 2016 Contribuyentes de convenio multilateral"=>"2017-10-00",
        "Recategorizacion cuatrimestral regimen simplificado"=>"2017-10-00"
    ]
];

function stringifySubarrays($array){
    foreach($array as &$a){  // modify $a by reference
        foreach($a as $k=>&$v){  // modify $v by reference
          $v="$k Vence: $v";  // write new value using key and value
        }
        $a=implode("\n\n",$a); // glue new subarray of string together using 2 newline characters
    }
    return $array;  // return the new array
}
var_export(stringifySubarrays($array));

输出:

array (
  257 => 'recaudacion Vence: 2017-10-07

          Contribuyentes Locales,Activid. Especiales y Salas de Recreacion Vence: 2017-10-16

          Contribuyentes Convenio Multilateral Vence: 2017-10-13

          Regimen simplificado Vence: 2017-10-00

          Declaracion Jurada Fiscal 2016 Contibuyentes Locales Vence: 2017-10-00',
  258 => 'Impuestos de Sellos Vence: 2017-10-10

          Declaracion Jurada anual 2016 Contribuyentes de convenio multilateral Vence: 2017-10-00

          Recategorizacion cuatrimestral regimen simplificado Vence: 2017-10-00',
)

P.S。我应该指出你的代码中存在逻辑错误。 return $destinatario;永远不会发生,因为return $mail;标记了函数调用的结束。

这是一个建议:

function crearMailDeVencimientos($idPerfil, $impuestosDelPerfil){
    // ... processing ...
    return [$mail,$destinatario];  // send back both pieces of data
}

function enviarMail(){
    // ...  code ...
    foreach ($impuestosPorPerfil as $idPerfil => $impuestosDelPerfil) {
        list($mail,$destinatario) = crearMailDeVencimientos($idPerfil, $impuestosDelPerfil);
        //   ^^^^^ ^^^^^^^^^^^^^ assign variable names to the two returned values
        // ... code ...
    }
}

根据您希望如何显示数据,您可以使用以下内容:

function crearMailDeVencimientos($idPerfil, $impuestosDelPerfil){
    $datos = getPerfilData($idPerfil);
    $mail = "impuestos de: ".$datos[0]['nombre'];
    $destinatario = $datos[0]['email'];
    foreach($impuestosDelPerfil as $i=>$a){
        $mail.="\n\n$i";  // double spacing before each id number
        foreach($a as $k=>$v){
            $mail.="\n\n\t$k Vence: $v";  // double spacing before each child, addintg \t (tab) for visual
        }
    }
    return [$mail,$destinatario];  // send back both pieces of data
}

function enviarMail(){
    $impuestosPorPerfil = filtrarImpuestos();
    foreach ($impuestosPorPerfil as $idPerfil => $impuestosDelPerfil) {
        list($mail,$destinatario) = crearMailDeVencimientos($idPerfil, $impuestosDelPerfil);
        $correo = "email@example.com";
        $asunto = "Vencimientos del mes actual";
        $headers = "From: [redacted]"." <".$correo.">\r\n";
        $headers .= "MIME-Version: 1.0\r\n";
        $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";

        // mail($destinatario,$asunto,$mail,$headers);
        echo '<div class="enviado">Enviado</div>';
   }
}

答案 1 :(得分:0)

假设Array(2)是多维数组中的顶级,那么这样的东西应该有效:

$newarray = Array();

foreach($arr as $firstkey => $arr2) { //$arr here is the variable that contains your array
    $newstring = "";
    $first = true;
    foreach($arr2 as $key => $val) {
        $newstring .= ($first ? "" : "\r\n\r\n") . $key . " Vence: " . $val;
        $first = false;
    }
    $newarray[$firstkey] = $newstring;
}

3v4l.org result

$first的目的是为了不添加尾随或前面的换行符。这是由三元运算符(1 = 1 ? [this will execute if 1=1 is true] : [this will execute if 1=1 is false])

完成的