Linearize: avagy többdimenziós tömb a múlté?

March 15th, 2010 17:23 - hozzászólások: 0, nézettség: 508

A napokban összedobtam egy-két tömbkezelő függvényt, amik lényegében nem egy szimpla kezelő-módosító függvények, hanem az adott tömb struktúráját tudjuk vele változtatni. Alkalom adtán igen hasznosak lehetnek.

Mire jó ez? - Arra jó, hogy többdimenziós tömböt átalakítsunk egy dimenzióba, majd vissza. Ezzel alkalmanként könnyebben tudjuk kezelni a tömbünket.
Mikor érdemes használni? - Nos, ezt mindenki döntse el maga. Én minden esetre rendszerességgel alkalmazom e függvényeket, amikor a helyzet úgy kívánja.

Több mindent nem is írnék, lássuk először a programkódot és a kimeneti eredményeket:

<?php
// $array = array( ... );
$lin = linearize($array);
print_r($lin);
print_r(unlinearize($lin));
?>

Kimenet:


// LINEARIZÁCIÓ ELŐTT / BEFORE LINEARIZE:
Array
(
  [users] => Array
    (
      [0] => Array
        (
          [name] => john.doe
          [email] => john.doe@domain.com
        )

      [1] => Array
        (
          [name] => anonymus
          [email] => annonymus@xy.com
        )

      [2] => Array
        (
          [name] => admin
          [email] => info@valami.hu
        )

    )
  [files] => Array
    (
      [0] => images/high_quality/image_002.jpg
      [1] => docs/campany/credit.doc
      [2] => images/background.png
      [3] => images/high_quality/image_001.jpg
      [4] => docs/service/licence.doc
      [images/high_quality/image_003.jpg] => Array
        (
          [time] => 1268435446
          [extension] => jpg
          [mimetype] => image/jpeg
        )

    )
)

// LINEARIZÁCIÓ UTÁN / AFTER LINEARIZE:
Array
(
  [users:0:name] => john.doe
  [users:0:email] => john.doe@domain.com
  [users:1:name] => anonymus
  [users:1:email] => annonymus@xy.com
  [users:2:name] => admin
  [users:2:email] => info@valami.hu
  [files:0] => images/high_quality/image_002.jpg
  [files:1] => docs/campany/credit.doc
  [files:2] => images/background.png
  [files:3] => images/high_quality/image_001.jpg
  [files:4] => docs/service/licence.doc
  [files:images/high_quality/image_003.jpg:time] => 1268435446
  [files:images/high_quality/image_003.jpg:extension] => jpg
  [files:images/high_quality/image_003.jpg:mimetype] => image/jpeg
)

Majd itt vannak a kezelő függvények, ezeknél annyit mondanék, hogy a linearize() függvény esetében a $flag változót el is felejthetjük, hiszen nem bemeneti és kimeneti érték!

<?php
// $data - input multi array
// $address - array key (elhanyagolható)
// $flag - függvény rekurzív működéséhez szükséges (ez nem bemenet!)
function linearize(array $data, $address = null, $flag = false) {
  if (empty($address)) {
    $insert = null;
  } else {
    $addr_arr = explode(':', $address);
    foreach ($addr_arr as $current) $insert .= "$current:";
  }
  foreach ($data as $key => $val) {
    if (is_array($val) && count($val) > 0)
      strlen($address) ? $eval .= linearize($val, "$address:$key", true) : $eval .= linearize($val, "$key", true);
    else {
      if (is_array($val)) $eval .= '$tmp[\''.$insert.$key.'\'] = array();'."\n";
      if (is_null($val)) $eval .= '$tmp[\''.$insert.$key.'\'] = null;';
      if (is_bool($val) && $val === true) $eval .= '$tmp[\''.$insert.$key.'\'] = true;';
      if (is_bool($val) && $val === false) $eval .= '$tmp[\''.$insert.$key.'\'] = false;';
      if (is_numeric($val)) $eval .= '$tmp[\''.$insert.$key.'\'] = '.$val.';';
      if (is_string($val)) $eval .= '$tmp[\''.$insert.$key.'\'] = "'.addslashes($val).'";';
    }
  }
  if ($flag) return $eval;
  else { eval($eval); return $tmp; }
}

// $data - input linearized array
// $address - array key (elhanyagolható, viszont ha definiáltuk a linearized() fv.-nél érdemes itt is)
function unlinearize(array $data, $address = null) {
  if (empty($address)) {
    $insert = null;
  } else {
    $addr_arr = explode(':', $address);
    foreach ($addr_arr as $current) $insert .= "$current:";
  }
  foreach ($data as $key => $val) {
    $eval = null;
    $keys = explode(':', str_replace($insert, null, $key));
    foreach ($keys as $f) {
      if (is_numeric($f)) $eval .= '['.$f.']';
      elseif (is_string($f)) $eval .= '["'.$f.'"]';
    }
    if (is_null($val)) $val = 'null';
    elseif (is_bool($val) && $val === true) $val = 'true';
    elseif (is_bool($val) && $val === false) $val = 'false';
    elseif (is_numeric($val)) $val = $val;
    elseif (is_string($val)) $val = '"'.addslashes($val).'"';
    elseif (is_array($val)) $val = var_export($val, true);
    eval('$tmp'.$eval.' = '.$val.'; ');
  }
  return $tmp;
}
?>

E bejegyzés végéhez is értem, remélem hasznos lesz számotokra.

Eddig még egy hozzászólás sem érkezett

Hozzászólás írása

Az e-mail címed nem kerül nyilvánosságra. A *-gal jelölt mezők kitöltése kötelező