Banner

Ultima revisión 22/12/2012

Convertir de Array a SOAP en PHP (array2SOAP)

array2soap es una función que os permitirá convertir un array asociativo en un SOAP de forma muy sencilla. Sólo hay que enviarle un array bien formado.

Para conocer más sobre SOAP (Simple Object Access Protocol) podéis leer el artículo que se ecribió Crear un Web Service con PHP y MySQL (Introducción) dónde se explica, entre otras cosas este protocolo.

Para presentarlo por pantalla, habrá que enviar las cabeceras (header) correspondientes a las de un XML y hacer un echo.

/*     **************************************************************************************************************************************************************************************************
    FUNCIÓN PARA CONVERTIR UN ARRAY ASOCIATIVO EN UNA CADENA EN FORMATO SOAP.
    PARÁMETROS:
    -----------
    $data             --> ES EL ARRAY FUENTE
    $level            --> NO CAMBIAR. INDICA EL NODO DÓNDE ESTA. SE USA PARA EL PROCESO RECURSIVO.
    ***************************************************************************************************************************************************************************************************/
/**
 * Function for convert an array associative at SOAP messages. Only used with Web Service connection.
 * @param string $data The source array.
 * @param int Indicates recursive level. 
 * @return string Returns a SOAP / WS message.
 */
function array2soap($data, $level=0){
    if (is_numeric(key($data))) {
        $key = "nodeId_". (string) $key;
    }

    if ($level == 0){
        $soap = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.islavisual.com/ws" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'."\r\n";
        $soap.= "\t".'<SOAP-ENV:Header>'."\r\n";
        $soap .= "\t\t".'<To>Administrador</To>'."\r\n";
        $soap .= "\t\t".'<From>Usuario</From>'."\r\n";
        $soap .= "\t".'</SOAP-ENV:Header>'."\r\n";
        $soap.= "\t".'<SOAP-ENV:Body>'."\r\n";
        $soap.= "\t\t".'<ns1:RequestResponse>'."\r\n";
        $soap.= "\t\t\t".'<results>'."\r\n";
        $soap.= "\t\t\t\t".'<SOAP-ENC:Struct xsi:type="ns1:results">'."\r\n";
    } 
    
    foreach ($data as $key => $value) {
        if (is_array($value)) {
            $soap.= str_repeat("\t", $level+4).'<ns1:'.$key.'>'."\r\n";
            $soap .= array2soap($value, $level+1);
            $soap.= str_repeat("\t", $level+4).'</ns1:'.$key.'>'."\r\n";
        }  else {
            $soap .= str_repeat("\t", $level+4).'<ns1:'.$key.'>'.$value.'</ns1:'.$key.'>'."\r\n";
        }
    }
                
    if ($level == 0){
        $soap .= "\t\t\t\t".'</SOAP-ENC:Struct>'."\r\n";
        $soap .= "\t\t\t".'</results>'."\r\n";
        $soap .= "\t\t".'</ns1:RequestResponse>'."\r\n";
        $soap .= "\t".'</SOAP-ENV:Body>'."\r\n";
        $soap .= '</SOAP-ENV:Envelope>'."\r\n";
    } 
    
    return $soap;
    
}

$arr = array("user" => "root", "user_id" => "1", "password" => "contraseña", "mensaje" => array("id" => "1", "descripcion" => "Descripción del texto", "prioridad" => "Alta"));
$soap = array2soap($arr);
header('Content-Type: application/xml; charset=utf-8');
echo $soap;

Espero que os sea útil alguna vez.