entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Error usando preg_match_all() en un Array

Busco ayuda para resolver el mensaje:

Notice: Array to string conversion in

Estoy usando el siguiente código para sacar información de la variable $response en este caso access_token y id como pueden ver esos valores se repiten por eso uso preg_match_all

<?php
 $response = '{"data":[{"access_token":"EAAby7f21xKABALPCThZC63i4LZAHZC7MaYbQ0E5gN","id":"515968102105625"},{"access_token":"EAAby7f21xKABAK0zyfHCVNBE0Nn3g1XZCWuXzZA4T","id":"1338263602879836"}],"paging":{"cursors":{"before":"NTE1OTY4MTAyMTA1NjI1","after":"MTMzODI2MzYwMjg3OTgzNgZDZD"}}}';

    if (preg_match_all('#"access_token":[^"]*"([^"]*)"#', $response, $datos)) {
        $mp = $datos[1];
    } else {
        $mp = 'error';
    }
    echo $mp;

    ?>

Busco la manera de obtener los access_token de la variable $response
Aveces son muchos pero por alguna razon preg_match_all() no funciona
Espero su ayuda

1 Respuesta

2votos

magarzon Puntos30650

Hola.

La respuesta que te da preg_match_all en $datos es un array multidimensional. Esto quiere decir que en $datos[1] tienes un array, no un string, por eso te da el error.

En $datos[0] tendrias un array con todas las cadenas que coinciden con el patrón concreto. Por ejemplo en tu caso $datos[0] contiene un array de dos elementos:

0   =>  "access_token":"EAAby7f21xKABALPCThZC63i4LZAHZC7MaYbQ0E5gN"
1   =>  "access_token":"EAAby7f21xKABAK0zyfHCVNBE0Nn3g1XZCWuXzZA4T"

En $datos[1] tendrías un array con las cadenas coincidentes con lo que va entre paréntesis en tu patrón, en este caso, otro array de dos elementos:

0   =>  EAAby7f21xKABALPCThZC63i4LZAHZC7MaYbQ0E5gN
1   =>  EAAby7f21xKABAK0zyfHCVNBE0Nn3g1XZCWuXzZA4T

Por tanto, tu código funciona, solo tienes que manejar la respuesta de forma adecuada.

De todas formas,ya que estás trabajando con json, yo también haría una medición de cuánto tarda tu solución frente a otra en la que obtengas un array con json_decode y después recorras ese array obteniendo los valores. Las expresiones regulares no son precisamente la solución de más rendimiento, sobre todo si tu cadena se complica y es más grande.

2votos

Leonardo-Tadei comentado

+1 a usar las funciones propias de PHP para procesar JSON: además de que hacerlo a mano es una complejidad innecesaria, cada vez que tengas una estructura no contemplada como contenido del JSON tendrás que ampliar la expresión regular...

1voto

Botxtrem-Solutions comentado

intentando tu respuesta igual me da el error

<?php
$response = '{"data":[{"access_token":"EAAby7f21xKABALPCThZC63i4LZAHZC7MaYbQ0E5gN","id":"515968102105625"},{"access_token":"EAAby7f21xKABAK0zyfHCVNBE0Nn3g1XZCWuXzZA4T","id":"1338263602879836"}],"paging":{"cursors":{"before":"NTE1OTY4MTAyMTA1NjI1","after":"MTMzODI2MzYwMjg3OTgzNgZDZD"}}}';

if (preg_match_all('#"access_token":[^"]*"([^"]*)"#', $response, $datos)) {
    $mp = $datos[0];
} else {
    $mp = 'error';
}

echo $mp;
?> 

Notice: Array to string conversion in /in/YdY78 on line 10 Array

2votos

magarzon comentado

Es que yo no te dije que obtuvieras el $datos[0], te dije que en el 0 tenías unos datos y en el 1 otros, pero que en ambos casos es una array que tienes que recorrer, lee de nuevo mi respuesta

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta