2009-01-11 49 views
16

Tengo una matriz asociativa multidimensional que incluye elementos como unaConvertir una cadena a variable

$data["status"] 
$data["response"]["url"] 
$data["entry"]["0"]["text"] 

Tengo unas cadenas como:

$string = 'data["status"]'; 
$string = 'data["response"]["url"]'; 
$string = 'data["entry"]["0"]["text"]'; 

¿Cómo puedo convertir las cadenas en la Primera una variable para acceder al elemento de matriz adecuado? Este método deberá funcionar en cualquier matriz en cualquiera de las dimensiones.

Respuesta

14

rápida y sucia:

echo eval('return $'. $string . ';'); 

Por supuesto tendría que ser desinfectado por primera vez la cadena de entrada.

Si no te gusta lo rápido y lo sucio ... entonces esto también funcionará y no requiere evaluación, lo que incluso me hace temblar.

Lo hace, sin embargo, hacer suposiciones sobre el formato de cadena:

<?php 
$data['response'] = array(
    'url' => 'http://www.testing.com' 
); 

function extract_data($string) { 
    global $data; 

    $found_matches = preg_match_all('/\[\"([a-z]+)\"\]/', $string, $matches); 
    if (!$found_matches) { 
      return null; 
    } 

    $current_data = $data; 
    foreach ($matches[1] as $name) { 
      if (key_exists($name, $current_data)) { 
        $current_data = $current_data[$name]; 
      } else { 
        return null; 
      } 
    } 

    return $current_data; 
} 

echo extract_data('data["response"]["url"]'); 
?> 
+0

Qué alternativa más detallada. ¿Qué hay de recomendar un formato de cadena mejor y más útil? –

+6

Porque eso no respondería a la pregunta. –

-1

Se podría acceder a ellos les gusta:

print $$string; 
+0

-1 Esto no funciona. – Triptych

+0

Tienes razón, no funciona con las matrices. Debería haber probado mejor. – MattBelanger

47

PHP de variable variables le ayudará a cabo aquí. Usted las puede utilizar como prefijo la variable con otro signo del dólar:

$foo = "Hello, world!"; 
$bar = "foo"; 
echo $$bar; // outputs "Hello, world!" 
+0

No sabía que esto funcionaba con matrices anidadas. –

+0

Esto me solucionó un problema; no estaba al tanto de las variables variables. Gracias! – Greg

+0

@Greg: Probablemente solo enmascaró el problema y lo empeoró: P –

0

encontrado esto en la página Variable variables:

function VariableArray($data, $string) { 
    preg_match_all('/\[([^\]]*)\]/', $string, $arr_matches, PREG_PATTERN_ORDER); 

    $return = $arr; 
    foreach($arr_matches[1] as $dimension) { $return = $return[$dimension]; } 

    return $return; 
} 
+0

Estoy seguro de que esto no funcionaría con comillas dobles alrededor de los nombres de los campos, y si $ string no era válido ... estoy bastante seguro de que se bloquee. –

+0

Correcto, mi prueba rápida demostró que debe usar algo como: [entrada] [0] [texto] – Gilean

0

he tenido problemas con eso también, Tenía esta:

$user = array('a'=>'alber', 'b'=>'brad'...); 

$array_name = 'user'; 

y me preguntaba cómo entrar en Albert.

al principio me trataron

$value_for_a = $$array_name['a']; // this dosen't work 

continuación

eval('return $'.$array_name['a'].';'); // this dosen't work, maybe the hoster block eval which is very common 

, finalmente probé la estupidez:

$array_temp=$$array_name; 
$value_for_a = $array_temp['a']; 

y esto simplemente perfecto trabajado! sabiduría, hazlo simple, hazlo estúpido.

espero que esto responda a su pregunta

5

Esto se puede hacer de una manera mucho más sencilla. Todo lo que tienes que hacer es pensar en qué función proporciona PHP que crea variables.

$string = 'myvariable'; 
extract(array($string => $string)); 
echo $myvariable; 

done!

0

Puede pasar por referencia con el operador &.Así que en su ejemplo, usted tendrá algo como esto

$string = &$data["status"]; 
$string = &$data["response"]["url"]; 
$string = &$data["entry"]["0"]["text"]; 

lo contrario tienes que hacer algo como esto:

$titular = array(); 
for ($r = 1; $r < $rooms + 1; $r ++) 
{ 
    $title = "titular_title_$r"; 
    $firstName = "titular_firstName_$r"; 
    $lastName = "titular_lastName_$r"; 
    $phone = "titular_phone_$r"; 
    $email = "titular_email_$r"; 
    $bedType = "bedType_$r"; 
    $smoker = "smoker_$r"; 

    $titular[] = array(
     "title" => $$title, 
     "first_name" => $$firstName, 
     "last_name" => $$lastName, 
     "phone" => $$phone, 
     "email" => $$email, 
     "bedType" => $$bedType, 
     "smoker" => $$smoker 
    ); 
}