print_r로 인쇄 된 배열의 출력으로부터 어떻게 배열을 만드나요?
PHPprint_r로 인쇄 된 배열의 출력으로부터 어떻게 배열을 만드나요?
배열이 있습니다.
$a = array('foo' => 'fooMe');
나는 이렇게한다.
print_r($a);
어떤 인쇄 :
Array ( [foo] => printme )
함수가 있으므로, 할 때 :
needed_function(' Array ( [foo] => printme )');
나는 배열 배열을 얻을 것이다 ( 'foo'=> 'fooMe'); 뒤로?
해결법
-
==============================
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.배열을 문자열로 저장하려면 serialize [docs]를 사용하고 [docs]를 unserialize하십시오.
배열을 문자열로 저장하려면 serialize [docs]를 사용하고 [docs]를 unserialize하십시오.
귀하의 질문에 대답하려면 : 아니요, 내장 된 함수 print_r의 출력을 다시 배열로 구문 분석 할 수 있습니다.
-
==============================
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.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.당신은 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.그것의 이름이 무엇인지 정확하게하는 멋진 온라인 도구가 있습니다 :
그것의 이름이 무엇인지 정확하게하는 멋진 온라인 도구가 있습니다 :
print_r을 json 온라인 변환기로 보내기
JSON 객체에서 json_decode 함수로 배열을 생성하기까지 :
이 배열을 얻으려면 두 번째 매개 변수를 true로 설정하십시오. 그렇지 않으면 대신 개체를 얻게됩니다.
json_decode($jsondata, true);
-
==============================
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.내 함수가 멋지다고 생각합니다. 중첩 된 배열을 사용합니다.
내 함수가 멋지다고 생각합니다. 중첩 된 배열을 사용합니다.
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.온라인 도구가 있습니다. http://www.printr-reverse.org/
온라인 도구가 있습니다. http://www.printr-reverse.org/
그것은 괜찮은 일을하지만 서브 어레이와 아마도 다른 장소들 이후에 쉼표를 놓치기 때문에 약간의 수작업으로 해결해야합니다.
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
'PHP' 카테고리의 다른 글
PHP 메일 ()을 통해 보낸 메일이 스팸 메일을 보내지 않도록하려면 어떻게합니까? (0) | 2018.09.18 |
---|---|
정의되지 않은 오프셋 PHP 오류 (0) | 2018.09.18 |
PHP : 배열 값을 즉시 접근 (0) | 2018.09.18 |
HTML / PHP - 양식 - 배열로 입력 (0) | 2018.09.18 |
PHP 페이지를 이미지로 반환 (0) | 2018.09.18 |