php
  • arrays
  • string
  • variables
  • 2009-01-11 14 views 16 likes 
    16

    ich ein mehrdimensionales assoziativen Array habe, die ein Element wieeinen String konvertieren zu Variable

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

    ich ein Zeichenketten wie habe:

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

    Wie kann ich die Saiten konvertiere in eine Variable für den Zugriff auf das richtige Array-Element? Diese Methode muss für jedes Array in einer beliebigen Dimension funktionieren.

    Antwort

    14

    Schnell und schmutzig:

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

    Natürlich müssten die Eingabezeichenfolge zum ersten hygienisiert werden werden.

    Wenn Sie nicht schnell und schmutzig mögen ... dann wird dies auch funktionieren und es erfordert keine Eval, die sogar mich zum Weinen bringt.

    Sie räumt jedoch ein, machen Annahmen über die String-Format:

    <?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

    Was für eine ausführliche Alternative Was ist mit der Empfehlung eines besseren, nützlicheren Zeichenkettenformats? –

    +6

    Weil das die Frage nicht beantworten würde. –

    -1

    Sie würden auf sie zugreifen möchten:

    print $$string; 
    
    +0

    -1 Das funktioniert nicht. – Triptych

    +0

    Du hast Recht, es nicht mit dem Arrays funktioniert. Sollte getestet haben – MattBelanger

    47

    PHP variable variables Sie hier draußen helfen. Sie können sie verwenden, indem Sie die Variable mit einem anderen Dollarzeichen vorangestellt wird:

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

    Ich war mir nicht bewusst, dass dies mit verschachtelten Arrays funktionierte. –

    +0

    Dies löste ein Problem für mich; war nicht bewusst Variablen Variablen. Vielen Dank! – Greg

    +0

    @Greg: Es maskiert wahrscheinlich nur das Problem und machte es noch schlimmer: P –

    0

    Fand dieses auf der Variable variables Seite:

    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

    Ziemlich sicher würde das nicht funktionieren mit doppelten Anführungszeichen um Feldnamen, und wenn die $ Zeichenkette ungültig war ... Ich bin mir ziemlich sicher, dass es abstürzen würde. –

    +0

    Richtig, mein Schnelltest hat gezeigt, dass du etwas wie folgendes verwenden musst: [entry] [0] [text] – Gilean

    0

    ich damit auch zu kämpfen hatte, ich diese hatte:

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

    und ich fragte mich, wie man in Albert einsteigen kann.

    auf den ersten habe ich versucht,

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

    dann

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

    dann endlich habe ich versucht, die dumme Sache:

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

    und diese gerade gearbeitet Perfect! Weisheit, mach es einfach, mach es dumm.

    Ich hoffe, Ihre Frage damit beantwortet

    5

    Dies kann auf viel einfachere Art und Weise durchgeführt werden. Alles, was Sie tun müssen, ist darüber nachzudenken, welche Funktion PHP bietet, die Variablen erstellt.

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

    erledigt!

    0

    Sie können durch Bezugnahme mit dem Operator & übergeben werden.Also in Ihrem Beispiel so etwas wie diese

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

    Sie sonst haben müssen Sie so etwas wie dies tun:

    $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 
        ); 
    } 
    
    0

    Es gibt nativen PHP-Funktion dafür: Verwendung http://php.net/manual/ru/function.parse-str.php (parse_str()) .

    vergessen Sie nicht, die Zeichenfolge ‚"‘zu bereinigen, bevor das Parsen.

    Verwandte Themen