kostenloser Webspace werbefrei: lima-city


print_r Ausgabe in Array umwandeln

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    slashdacoda

    Kostenloser Webspace von slashdacoda, auf Homepage erstellen warten

    slashdacoda hat kostenlosen Webspace.

    hi leute, so hier mal ne frage für eingefleischte php'ler^^

    suche ne function :rolleyes:;)

    worums geht:

    ich möchte ein text String direkt als Array verarbeiten.

    eigl kein thema wenn es in JSON (Java) ursprung hat,

    würde ohne probleme mit json_decode(); funzen....

    Problem is aber das die Daten so aussehen:

    Array
    (
        [a] => Apfel
        [b] => Banane
        [c] => Array
            (
                [0] => x
                [1] => y
                [2] => z
            )
    )


    also eine Ausgabe die so generiert wurde:

    <?php
        $a = array ('a' => 'Apfel', 'b' => 'Banane', 'c' => array ('x', 'y', 'z'));
        print_r ($a);
    ?>



    wie bekomm ich das hin ohne den kramm zu parsen ?? :-D

    anbei bemerkt die Daten generiere ich nicht selber, ich hole mit den String aus einer fremden URL mittels file_get_contents($url);



  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Was soll die Eingabe und was soll die Ausgabe sein?
    Soll die Eingabe ein String sein und die Ausgabe dein Array? Wenn ja, wie sieht der String aus.
    Soll die Eingabe dein Array sein und die Ausgabe ein String? Wenn ja, wie soll der String aussehen?
  4. Autor dieses Themas

    slashdacoda

    Kostenloser Webspace von slashdacoda, auf Homepage erstellen warten

    slashdacoda hat kostenlosen Webspace.

    also um das klar zu stellen...

    ich hole mir die Daten aus der url

    $daten[]=GESUCHTEFUNKTION(file_get_contents($url));


    in der angeforderten url steht:

    Array
    (
        [a] => Apfel
        [b] => Banane
        [c] => Array
            (
                [0] => x
                [1] => y
                [2] => z
            )
    )


    und möchte dann einfach die Daten wieder so ausgeben:

    echo $daten['a'];


    und ausgegeben wird dann einfach:

    Apfel




    zusatz:

    Problem ist das kommenden Daten vom Typ Char bzw ein String ist , möchte das ganze aber zum Typ Array wandeln ohne zu parsen da ich nicht weis wie groß und wellche Inhalte sich darin verbergen...


    Beitrag zuletzt geändert: 14.12.2010 23:29:45 von slashdacoda
  5. eval führt als string (zeichenkette) gespeicherten Code aus.
    Bedenke das eval ein Sicherheitsproblem ist und deswegen wäre es für Dich eigentlich sicherer den string zu parsen.
    Theoretisch könnte jede Art von Code so ausgelesen werden und dadurch Dein Webspace gecrackt werden.
  6. Autor dieses Themas

    slashdacoda

    Kostenloser Webspace von slashdacoda, auf Homepage erstellen warten

    slashdacoda hat kostenlosen Webspace.

    Sicherheitsprobleme mal bei seite gelassen...

    funtz trotzdem nich...

    führt zwar gespeicherten code aus aber bei diesem beispiel gehts nich:

    index2.php
    <?php
        $a = array ('a' => 'Apfel', 'b' => 'Banane', 'c' => array ('x', 'y', 'z'));
        print_r ($a);
    ?>


    index.php
    <?php
    function getchardetails()
    {
    	$url="http://localhost/index2.php";
    	return $text = file_get_contents($url);
    }
    
    $array[]=eval(getchardetails());
    echo $daten['a'];
    ?>


    ergebnis:
    Parse error: syntax error, unexpected '[', expecting ')' in E:\xampp\htdocs\index.php(8) : eval()'d code on line 3



    der reine String:
    Array ( [a] => Apfel [b] => Banane [c] => Array ( [0] => x [1] => y [2] => z ) )


    da ich aber das ganze direkt als array haben möchte ... macht der die biege :puke:

    NACHTRAG: habs auch mit trikserei probiert wie:
    eval('$ar[]="'.getchardetails().'";');

    aber da kommt nix raus^^

    Beitrag zuletzt geändert: 15.12.2010 15:32:29 von slashdacoda
  7. 1. Eval liefert dir nichts relevantes. Wenn alles klappt, dann liefert es sogar NULL zurück. Eval bedeutet, dass der übergebene Code ausgeführt wird.

    2.
    eval('$ar[]="'.getchardetails().'";');
    Das ist überaus unschön. Das wird keine brauchbaren Ergebnisse liefern.

    3.
    $array=eval(getchardetails());
    statt
    $array[]=eval(getchardetails());
    Aber siehe Punkt 1.

    4.
    echo $daten['a'];
    $daten ist undefiniert, also NULL. Folglich erscheint auch NULL auf dem Bildschirm.


    Wenn du die Daten unbedingt so anfordern musst, dann schreibe dir doch einfach eine Funktion, die sie als Text ausliest und verwertet. Lösche Leerzeichen und Zeilenumbrüche; Spalte den Text erst bei allen "Array(" und dann bei "["...
    Ansonsten bitte doch einfach bei der Quelle, eine einfache Syntax zu verwenden, die leicht eingelesen werden kann.

    So etwas, wie:
    ?4|a|Apfel|b|Banane|c|?3|0|x|1|y|2|z
    Wobei hier ?n für ein Feld mit der Länge n steht und eine Zuweisung dadurch stattfindet, dass der Wert auf den Index folgt.

    Beitrag zuletzt geändert: 15.12.2010 16:01:15 von toolz
  8. Autor dieses Themas

    slashdacoda

    Kostenloser Webspace von slashdacoda, auf Homepage erstellen warten

    slashdacoda hat kostenlosen Webspace.

    ou beim runter coden hab ich das nich verändert... das mit $daten[] sollte eigl heißen $array... aber egal..

    back to topic...

    dann werde ich den kramm besser mal parsen bzw werde wohl eine function schreiben die aus dem kramm:(string)
    Array
    (
        [a] => Apfel
        [b] => Banane
        [c] => Array
            (
                [0] => x
                [1] => y
                [2] => z
            )
    )


    eine ausgabe macht die so asusehen würde: (JSON)

    {"a":"Apfel","b":"Banane","c":["x","y","z"]}


    dammit ich die wiederum mit:json_decode in ein array importiren kan....

    pfffff... ich wollt mir die arbeit sparen das so uimzusetzten, aber wenns nich anders geht.. 8-D

    einer ne idee wie der algorithmuss aussehen könnte ??

    nehme gerne vorschläge an :smokin:

    Beitrag zuletzt geändert: 15.12.2010 16:12:30 von slashdacoda
  9. NEIN! Tu es einfach nicht! Versuch den Anbieter des Strings davon zu überzeugen, dass er dir das ganze in serialize-Syntax gibt (oder evtl. auch json).

    So eine print_r Ausgabe zu parsen ist einfach Zeitverschwendung, nebenbei wahrscheinlich auch noch uneindeutig und unvollständig.
  10. Mhh ich merke das ich Dich mit eval eher in die Irre geführt habe weil's mit print_r-ausgaben nicht klappen kann.
    Grund ist das print_r die ausgabe nicht in Maschinenlesbarer Form ausgibt (es Fehlen , und ").
    Mit var_export ausgegebene Arrays würde man mit eval auslesen können.
    Also google angeworfen und das hier gefunden:

    <?php
    function print_r_reverse($in) {
        $lines = explode("\n", trim($in));
        if (trim($lines[0]) != 'Array') {
            // bottomed out to something that isn't an array
            return $in;
        } else {
            // this is an array, lets parse it
            if (preg_match("/(\s{5,})\(/", $lines[1], $match)) {
                // this is a tested array/recursive call to this function
                // take a set of spaces off the beginning
                $spaces = $match[1];
                $spaces_length = strlen($spaces);
                $lines_total = count($lines);
                for ($i = 0; $i < $lines_total; $i++) {
                    if (substr($lines[$i], 0, $spaces_length) == $spaces) {
                        $lines[$i] = substr($lines[$i], $spaces_length);
                    }
                }
            }
            array_shift($lines); // Array
            array_shift($lines); // (
            array_pop($lines); // )
            $in = implode("\n", $lines);
            // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
            preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $in, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
            $pos = array();
            $previous_key = '';
            $in_length = strlen($in);
            // store the following in $pos:
            // array with key = key of the parsed array's item
            // value = array(start position in $in, $end position in $in)
            foreach ($matches as $match) {
                $key = $match[1][0];
                $start = $match[0][1] + strlen($match[0][0]);
                $pos[$key] = array($start, $in_length);
                if ($previous_key != '') $pos[$previous_key][1] = $match[0][1] - 1;
                $previous_key = $key;
            }
            $ret = array();
            foreach ($pos as $key => $where) {
                // recursively see if the parsed out value is an array too
                $ret[$key] = print_r_reverse(substr($in, $where[0], $where[1] - $where[0]));
            }
            return $ret;
        }
    }
    
    ?>

    Quelle

    Die Funktion print_r_reverse sollte genau das tun was Du willst, ist aber von mir nicht getestet...
    Ich kenne nicht den Hintergrund Deines Projektes aber für mich klingt das etwas merkwürdig das die Daten-Übergabe ausgerechnet mit print_r geschieht.
    Hast Du da gar keinen Einfluss drauf?

  11. Warum denn das Rad neu erfinden?

    <?php 
    function json_enc($arr) { 
        if(function_exists('json_encode')) return json_encode($arr);
        $parts = array(); 
        $is_list = false; 
    
        $keys = array_keys($arr); 
        $max_length = count($arr)-1; 
        if(($keys[0] == 0) and ($keys[$max_length] == $max_length)) {
            $is_list = true; 
            for($i=0; $i<count($keys); $i++) {
                if($i != $keys[$i]) {
                    $is_list = false;
                    break; 
                } 
            } 
        } 
    
        foreach($arr as $key=>$value) { 
            if(is_array($value)) {
                if($is_list) $parts[] = json_enc($value);
                else $parts[] = '"' . $key . '":' . json_enc($value);
            } else { 
                $str = ''; 
                if(!$is_list) $str = '"' . $key . '":'; 
    
                if(is_numeric($value)) $str .= $value;
                elseif($value === false) $str .= 'false';
                elseif($value === true) $str .= 'true'; 
                else $str .= '"' . addslashes($value) . '"';
    
                $parts[] = $str; 
            } 
        } 
        $json = implode(',',$parts); 
         
        if($is_list) return '[' . $json . ']';
        return '{' . $json . '}';
    }
    ?>


    Beitrag zuletzt geändert: 16.12.2010 12:45:56 von fabo
  12. @fabo: Warum denn das Rad neu erfinden?
    serialize($arr);

    Sorry, konnts mir nicht verkneifen :D
  13. Autor dieses Themas

    slashdacoda

    Kostenloser Webspace von slashdacoda, auf Homepage erstellen warten

    slashdacoda hat kostenlosen Webspace.

    yeah genau das ist mein Board^^

    print_r_reverse und json_enc perfekt thx leutez !!

    um es euch zu erklären müsste ich was weiter ausholen, aber sagen war es mal so, ich brauch die Funktionen um gewisse API's anzuzapfen, und da ich keine lust hab mich mit jeden der Entwickler in Verbindung zu setzen...

    nur zu Info, die geschichte hier betrift dann zb die API von Justin.tv falls einer das kennt :) ich will ein eigenständiges App auf meiner Seite mit suchen Funktion aus einer externen seite die evtl in ein Ipad / Iphone integriert werden könnte... I hope so long

    :-D
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!