복붙노트

print_r로 인쇄 된 배열의 출력으로부터 어떻게 배열을 만드나요?

PHP

print_r로 인쇄 된 배열의 출력으로부터 어떻게 배열을 만드나요?

배열이 있습니다.

$a = array('foo' => 'fooMe');

나는 이렇게한다.

print_r($a);

어떤 인쇄 :

Array ( [foo] => printme )

함수가 있으므로, 할 때 :

needed_function('    Array ( [foo] => printme )');

나는 배열 배열을 얻을 것이다 ( 'foo'=> 'fooMe'); 뒤로?

해결법

  1. ==============================

    1.실제로 "문자열 배열"을 실제 배열로 구문 분석하는 함수를 작성했습니다. 분명히, 그것은 다소 해킹과 같은 것이지만, 그것은 내 테스트 케이스에서 작동합니다. 다음은 http://codepad.org/idlXdij3에서 작동하는 프로토 타입에 대한 링크입니다.

    실제로 "문자열 배열"을 실제 배열로 구문 분석하는 함수를 작성했습니다. 분명히, 그것은 다소 해킹과 같은 것이지만, 그것은 내 테스트 케이스에서 작동합니다. 다음은 http://codepad.org/idlXdij3에서 작동하는 프로토 타입에 대한 링크입니다.

    링크를 클릭하는 느낌이 들지 않는 사람들을 위해 코드를 인라인으로 게시합니다.

    <?php
         /**
          * @author ninetwozero
          */
    ?>
    <?php
        //The array we begin with
        $start_array = array('foo' => 'bar', 'bar' => 'foo', 'foobar' => 'barfoo');
    
        //Convert the array to a string
        $array_string = print_r($start_array, true);
    
        //Get the new array
        $end_array = text_to_array($array_string);
    
        //Output the array!
        print_r($end_array);
    
        function text_to_array($str) {
    
            //Initialize arrays
            $keys = array();
            $values = array();
            $output = array();
    
            //Is it an array?
            if( substr($str, 0, 5) == 'Array' ) {
    
                //Let's parse it (hopefully it won't clash)
                $array_contents = substr($str, 7, -2);
                $array_contents = str_replace(array('[', ']', '=>'), array('#!#', '#?#', ''), $array_contents);
                $array_fields = explode("#!#", $array_contents);
    
                //For each array-field, we need to explode on the delimiters I've set and make it look funny.
                for($i = 0; $i < count($array_fields); $i++ ) {
    
                    //First run is glitched, so let's pass on that one.
                    if( $i != 0 ) {
    
                        $bits = explode('#?#', $array_fields[$i]);
                        if( $bits[0] != '' ) $output[$bits[0]] = $bits[1];
    
                    }
                }
    
                //Return the output.
                return $output;
    
            } else {
    
                //Duh, not an array.
                echo 'The given parameter is not an array.';
                return null;
            }
    
        }
    ?>
    
  2. ==============================

    2.배열을 문자열로 저장하려면 serialize [docs]를 사용하고 [docs]를 unserialize하십시오.

    배열을 문자열로 저장하려면 serialize [docs]를 사용하고 [docs]를 unserialize하십시오.

    귀하의 질문에 대답하려면 : 아니요, 내장 된 함수 print_r의 출력을 다시 배열로 구문 분석 할 수 있습니다.

  3. ==============================

    3.아니요. 그러나 serialize 함수와 json_ * 함수를 모두 사용할 수 있습니다.

    아니요. 그러나 serialize 함수와 json_ * 함수를 모두 사용할 수 있습니다.

    $a = array('foo' => 'fooMe');
    echo serialize($a);
    
    $a = unserialize($input);
    

    또는:

    echo json_encode($a);
    
    $a = json_decode($input, true);
    
  4. ==============================

    4.Subarrays가있는 Array 출력의 경우 ninetwozero에서 제공하는 솔루션이 작동하지 않습니다. 복잡한 배열에서 작동하는이 함수를 사용해보십시오.

    Subarrays가있는 Array 출력의 경우 ninetwozero에서 제공하는 솔루션이 작동하지 않습니다. 복잡한 배열에서 작동하는이 함수를 사용해보십시오.

    <?php
    
    $array_string = "
    
    Array
     (
       [0] => Array
        (
           [0] => STATIONONE
           [1] => 02/22/15 04:00:00 PM
           [2] => SW
           [3] => Array
                (
                    [0] => 4.51
                )
    
            [4] => MPH
            [5] => Array
                (
                    [0] => 16.1
                )
    
            [6] => MPH
        )
    
         [1] => Array
        (
            [0] => STATIONONE
            [1] => 02/22/15 05:00:00 PM
            [2] => S
            [3] => Array
                (
                    [0] => 2.7
                )
    
            [4] => MPH
            [5] => Array
                (
                    [0] => 9.61
                )
    
            [6] => MPH
        )
    )
    ";
    
    print_r(print_r_reverse(trim($array_string)));
    
    function print_r_reverse(&$output)
    {
        $expecting = 0; // 0=nothing in particular, 1=array open paren '(', 2=array element or close paren ')'
        $lines = explode("\n", $output);
        $result = null;
        $topArray = null;
        $arrayStack = array();
        $matches = null;
        while (!empty($lines) && $result === null)
        {
            $line = array_shift($lines);
            $trim = trim($line);
            if ($trim == 'Array')
            {
                if ($expecting == 0)
                {
                    $topArray = array();
                    $expecting = 1;
                }
                else
                {
                    trigger_error("Unknown array.");
                }
            }
            else if ($expecting == 1 && $trim == '(')
            {
                $expecting = 2;
            }
            else if ($expecting == 2 && preg_match('/^\[(.+?)\] \=\> (.+)$/', $trim, $matches)) // array element
            {
                list ($fullMatch, $key, $element) = $matches;
                if (trim($element) == 'Array')
                {
                    $topArray[$key] = array();
                    $newTopArray =& $topArray[$key];
                    $arrayStack[] =& $topArray;
                    $topArray =& $newTopArray;
                    $expecting = 1;
                }
                else
                {
                    $topArray[$key] = $element;
                }
            }
            else if ($expecting == 2 && $trim == ')') // end current array
            {
                if (empty($arrayStack))
                {
                    $result = $topArray;
                }
                else // pop into parent array
                {
                    // safe array pop
                    $keys = array_keys($arrayStack);
                    $lastKey = array_pop($keys);
                    $temp =& $arrayStack[$lastKey];
                    unset($arrayStack[$lastKey]);
                    $topArray =& $temp;
                }
            }
            // Added this to allow for multi line strings.
        else if (!empty($trim) && $expecting == 2)
        {
            // Expecting close parent or element, but got just a string
            $topArray[$key] .= "\n".$line;
        }
            else if (!empty($trim))
            {
                $result = $line;
            }
        }
    
        $output = implode("\n", $lines);
        return $result;
    }
    
    /**
    * @param string $output : The output of a multiple print_r calls, separated by newlines
    * @return mixed[] : parseable elements of $output
    */
    function print_r_reverse_multiple($output)
    {
        $result = array();
        while (($reverse = print_r_reverse($output)) !== NULL)
        {
            $result[] = $reverse;
        }
        return $result;
    }
    
    ?>
    

    작은 버그가 하나 있습니다. 빈 값 (빈 문자열)이 있으면 이전 값에 포함됩니다.

  5. ==============================

    5.당신은 print_r로 이것을 할 수 없다. var_export는 비슷하지만 비슷한 것을 허용해야한다.

    당신은 print_r로 이것을 할 수 없다. var_export는 비슷하지만 비슷한 것을 허용해야한다.

    http://php.net/manual/en/function.var-export.php

    $val = var_export($a, true);
    print_r($val);
    eval('$func_val='.$val.';');
    
  6. ==============================

    6.그것의 이름이 무엇인지 정확하게하는 멋진 온라인 도구가 있습니다 :

    그것의 이름이 무엇인지 정확하게하는 멋진 온라인 도구가 있습니다 :

    print_r을 json 온라인 변환기로 보내기

    JSON 객체에서 json_decode 함수로 배열을 생성하기까지 :

    이 배열을 얻으려면 두 번째 매개 변수를 true로 설정하십시오. 그렇지 않으면 대신 개체를 얻게됩니다.

    json_decode($jsondata, true);
    
  7. ==============================

    7.빠른 기능 (좋은 데이터를 보내는 경우 체크하지 않음) :

    빠른 기능 (좋은 데이터를 보내는 경우 체크하지 않음) :

    function textToArray($str)
    {
        $output = [];
    
        foreach (explode("\n", $str) as $line) {
    
            if (trim($line) == "Array" or trim($line) == "(" or trim($line) == ")") {
                continue;
            }
    
            preg_match("/\[(.*)\]\ \=\>\ (.*)$/i", $line, $match);
    
            $output[$match[1]] = $match[2];
        }
    
        return $output;
    }
    

    예상되는 입력입니다.

    Array
    (
        [test] => 6
    )
    
  8. ==============================

    8.내 함수가 멋지다고 생각합니다. 중첩 된 배열을 사용합니다.

    내 함수가 멋지다고 생각합니다. 중첩 된 배열을 사용합니다.

    function print_r_reverse($input)
    {
        $output = str_replace(['[', ']'], ["'", "'"], $input);
        $output = preg_replace('/=> (?!Array)(.*)$/m', "=> '$1',", $output);
        $output = preg_replace('/^\s+\)$/m', "),\n", $output);
        $output = rtrim($output, "\n,");
        return eval("return $output;");
    }
    

    NB : 사용자 입력 데이터와 함께 사용하지 않는 것이 좋습니다.

  9. ==============================

    9.온라인 도구가 있습니다. http://www.printr-reverse.org/

    온라인 도구가 있습니다. http://www.printr-reverse.org/

    그것은 괜찮은 일을하지만 서브 어레이와 아마도 다른 장소들 이후에 쉼표를 놓치기 때문에 약간의 수작업으로 해결해야합니다.

  10. from https://stackoverflow.com/questions/7025909/how-create-an-array-from-the-output-of-an-array-printed-with-print-r by cc-by-sa and MIT license