Pereiti prie turinio

PHP array_to_text(), text_to_array()


Svečias Aliarth

Rekomenduojami pranešimai

Svečias Aliarth

Sveiki. Esu sukures masyvo i teksta ir teksto i masyva funkcijas, bet jos per letos. Tai norejau paklausti gal yra daugiau mokanciu uz mane ir zino kaip cia kaika is ju reiketu pakeisti, kad pagreitinti visas sias funkcijas? ;)

 

http://aliarth.lt/text_array.txt

Pavizdiai surasyti ir viskas veikia vos paleidziant ta faila. Jis pajegia sutraukti i teksta begaliniu dimensiju masyva, bet ne asociacinius masyvus.

Redagavo Aliarth
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Sveiki. Esu sukures masyvo i teksta ir teksto i masyva funkcijas, bet jos per letos. Tai norejau paklausti gal yra daugiau mokanciu uz mane ir zino kaip cia kaika is ju reiketu pakeisti, kad pagreitinti visas sias funkcijas? ;)

 

http://aliarth.lt/text_array.txt

Pavizdiai surasyti ir viskas veikia vos paleidziant ta faila. Jis pajegia sutraukti i teksta begaliniu dimensiju masyva, bet ne asociacinius masyvus.

 

O negali tiesiog explode() ir implode() funkcijas naudoti?

Nuoroda į pranešimą
Dalintis kituose puslapiuose
Svečias Aliarth

Netikrinau tavo funkciju dar nes neturejau laiko, bet pasistengsiu siandien jas patikrinti ir atrasyti.

Aciu. Tokio tipo kuriu del to, kad galeciau prirasyti kur tiksliai palikta klaida del ko jo ir negali atkoduoti. :)

Redagavo Aliarth
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kol kas perziurejau tik array_to_text() ir nemanau, kad galima atlikti tai greiciau negu naudojant paprasta loop.

 

Teciau atlikau viena pakeitima:

   $max = count($array);
   for ($i = 0; $i < $max; $i++)
   {
       $value = $array[$i];

       if (isEmpty($value))
       {
           $out .= "";
       } // TUSCIAS INDEX'as
       else
       {
           if (is_bool($value))
           {
               $out .= $value ? "true" : "false";
           } else if (is_array($value))
           {
               $out .= array_to_text($value, $decode_setup, FALSE);
           } else
           {
               $out .= $value;
           }
       }

       if ($i < ($max - 1))
       {
           $out .= $array_split;
       }
   }

 

Pakeiciau i:

 

   $max = count($array);
   foreach ($array as $k => &$e)
   {
       if (!isEmpty($e))
       {
           $out .= (is_bool($e) ? ($e ? 'true' : 'false') : (is_array($e) ? array_to_text($e, $decode_setup, FALSE) : $e));
       }

       if ($k < ($max - 1))
       {
           $out .= $array_split;
       }
   }

 

Pagrindine pakeitimo priezastis - susitvarko su associative arrays, nors iskyla ir mazyte problema - del to kaip veikia foreach sumazeja $array dydzio lubos (php mem limit). Beje, jeigu idomu kodel naudoju '&$e' o ne '$e' - naudojamas pointeris i originalaus array elementa, o ne kuriama kopija to elemento, kas sutaupo laiko.

Redagavo Ispirit
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Turejau siek tiek laisvo laiko, tai perziurejau tavo text_to_array(). Nelabai jis man patiko nes yra visiskai be reikalo apkrautas substr(), kuris didziuli overhead sukuria.

 

Perrasiau taviske text_to_array() funkcija taip kad ji sugebetu atkurti multidimensional arrays ir nenaudotu substr():

function text_to_array($str, $decode_setup = NULL)
{
   $pos = 0;
   if (!$decode_setup)
   {
       $decode_setup = [$str[0], $str[1], $str[2]];
       $pos          = 3;
   }

   $text_array_begin = $decode_setup[0]; // [
   $text_array_end   = $decode_setup[1]; // ]
   $text_array_split = $decode_setup[2]; // ,

   $max = strlen($str);
   if ($str[$pos] == $text_array_begin)
       $pos++;

   return text_to_array_rec($str, $pos, $text_array_begin, $text_array_end, $text_array_split, $max);

}

function text_to_array_rec(&$str, &$pos, &$st, &$et, &$spt, &$max)
{
   $arr   = array();
   $cache = NULL;
   while ($pos < $max)
   {
       if ($str[$pos] == $st)
       {
           $pos++;
           $arr[] = text_to_array_rec($str, $pos, $st, $et, $spt, $max);
       } elseif ($str[$pos] == $et)
       {
           add_from_cache($cache, $arr);
           $pos++;

           return $arr;
       } elseif ($str[$pos] == $spt)
       {
           add_from_cache($cache, $arr);
           $pos++;
       } else
       {
           $cache .= "".$str[$pos];
           $pos++;
       }
   }

   return $arr;
}

function add_from_cache(&$cache, &$arr)
{
   if ($cache != NULL)
   {
       $arr[] = text_to_array_value($cache);
       $cache = NULL;
   }
}

 

Kadangi 'string' php kalboje is tiesu yra char array, galima i ji kreiptis kaip i array su 'string[]' ir nereikia naudot substr(). Taip pat, kad butu paprasta atkurti multidimension, pasinaudojau paprasta recursion, kuri tuom pasirupina.

Redagavo Ispirit
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...