Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z tablicami - print_r zamiast var_export
Forum PHP.pl > Forum > PHP
jkochanski
Witam,

Mam problem z tablicami. Mam zapisane w wiadomościach wyniki funkcji print_r dla pouzupełnianych tablic.

Pytanie czy na podstawie takiego wyniku można w php odtworzyć (automatycznie) tablicę.

Mam coś takiego (początek) i chcę mieć z tego tablicę.

Kod
Array
(
   [01] => Array
       (
           [01] => Array
               (
                   [01] => a
                   [ab] => a
               )

           [ab] => Array
               (
                   [a] => 6
               )

       )

   [02] => Array
       (
           [02] => Array
               (
                   [02] => a
                   [a1] => b
                   [a2] => Array
                       (
                           [0] => c
                       )

               )

       )
)
wookieb
Nie. Aby odtworzyć tablicę zapisuj wyniki z var_export albo z serialize.
Poza tym zmień nazwę tematu Temat: Jak poprawnie zatytulowac watek
jkochanski
teraz już wiem że powinienem był użyć var_export

problem w tym że mam około 1000 takich zapisów.

Rozumiem, że nie ma jakiejś możliwości przetworzenia tego (oczywiście poza ręcznym)
wookieb
Nie ma takiej opcji
ShadowD
Nie no nie przesadzajmy, jeśli masz taki schemat zawsze możesz wyrażeniami się bawić. Wydaje mi się, że istnieje opcja przerobienia tego jakąś funkcją, ale nie pamiętam jak to było..Raczej ni, pomyliło mi się. :-)
jkochanski
rozwiązanie znalazłem - gdyby było komuś potrzebne zamieszczam poniżej.

wookieb - polecam się upewnić zanim dajesz komuś tego typu rady.

  1.  
  2.  
  3. function print_r_reverse($in) {
  4. $lines = explode("\n", trim($in));
  5. if (trim($lines[0]) != 'Array') {
  6. // bottomed out to something that isn't an array
  7. return $in;
  8. } else {
  9. // this is an array, lets parse it
  10. if (preg_match("/(\s{5,})\(/", $lines[1], $match)) {
  11. // this is a tested array/recursive call to this function
  12. // take a set of spaces off the beginning
  13. $spaces = $match[1];
  14. $spaces_length = strlen($spaces);
  15. $lines_total = count($lines);
  16. for ($i = 0; $i < $lines_total; $i++) {
  17. if (substr($lines[$i], 0, $spaces_length) == $spaces) {
  18. $lines[$i] = substr($lines[$i], $spaces_length);
  19. }
  20. }
  21. }
  22. array_shift($lines); // Array
  23. array_shift($lines); // (
  24. array_pop($lines); // )
  25. $in = implode("\n", $lines);
  26. // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one)
  27. preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $in, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
  28. $pos = array();
  29. $previous_key = '';
  30. $in_length = strlen($in);
  31. // store the following in $pos:
  32. // array with key = key of the parsed array's item
  33. // value = array(start position in $in, $end position in $in)
  34. foreach ($matches as $match) {
  35. $key = $match[1][0];
  36. $start = $match[0][1] + strlen($match[0][0]);
  37. $pos[$key] = array($start, $in_length);
  38. if ($previous_key != '') $pos[$previous_key][1] = $match[0][1] - 1;
  39. $previous_key = $key;
  40. }
  41. $ret = array();
  42. foreach ($pos as $key => $where) {
  43. // recursively see if the parsed out value is an array too
  44. $ret[$key] = print_r_reverse(substr($in, $where[0], $where[1] - $where[0]));
  45. }
  46. return $ret;
  47. }
  48. }
  49.  
lukaskolista
ale po cholere uzywac takiego kombajnu? Nie lepiej uzyc serialize() i unserialize()? Przeciez do tego te funkcje wlasnie sluza... Chyba ze masz konkretny powod poza tym, ze z var_export ladniej wyglada
Sephirus
hehe ale ktoś wymyślił z tym print_r_reverse wink.gif RESPECT! ;P a wszystko z niewiedzy pewnie ;P
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.