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
Utoljára aktív
Legnézetebb
- „Memória” PHP-vel? Hogyan?
- Ubuntu Desktop Pack v2
- Photoshop kellékek
- Users of Ubuntu desktop pack
- Amire büszke vagyok…
- 35 briliáns fotó
Címkék
- összes
- info (2)
- software (2)
- ubuntu (3)
- linux (3)
- desktop (5)
- wallpaper (5)
- háttérképek (6)
- tutorial (1)
- xhtml (1)
- css (2)
- photoshop (1)
- textures (1)
- plug-in (1)
- photography (3)
- php (6)
- development (8)
- fejlesztés (8)
- script (6)
- webdesign (2)
- verseny (2)
- javascript (3)
- api (1)
- webtools (1)
- service (1)
Archívum
- January, 2008
- February, 2008
- March, 2008
- September, 2008
- March, 2009
- April, 2009
- May, 2009
- July, 2009
- August, 2009
- September, 2009
- November, 2009
- February, 2010
- March, 2010
- June, 2010
- August, 2010
