Multidimensional array to flat

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Multidimensional array to flat

Δημοσίευση από ThyClub » 23 Ιαν 2010 11:02

Ποιός είναι ο ευκολότερος και πιο γρήγορος τρόπος να κάνεις ένα multidimensional array ή object σε flat array?

Παράδειγμα:

Το :

Κώδικας: Επιλογή όλων

$arr = array(
array('value'=>'something'),
array('value1'=>'something1'),
array('value2'=>'something2'),
array('value3'=>array('value'=>'something')),
'simple'=>'simplevalue'
);
Να γίνει:

Κώδικας: Επιλογή όλων

$arr = array(
'0-value'=>'something',
'1-value1'=>'something1',
'2-value2'=>'something2',
'3-value3-value'=>'something',
'simple'=>'simplevalue'
);
??

Το έχω καταφέρει αλλά δεν ξέρω κατά πόσο έχω χρησιμοποιήσει τον πιο "memory friendly" τρόπο...any ideas?

panosru
WebDev Moderator
Δημοσιεύσεις: 1885
Εγγραφή: 13 Σεπ 2005 16:13
Τοποθεσία: Camp

Multidimensional array to flat

Δημοσίευση από panosru » 24 Ιαν 2010 21:57

Εγώ φίλε ThyClub θα έκανα χρήση της SPL library της PHP που είναι πλέων build in PHP 5 ένα απλό παράδειγμα παρακάτω:

Κώδικας: Επιλογή όλων

<?php
$arr = array&#40; 
	array&#40;'value'=>'something'&#41;, 
	array&#40;'value1'=>'something1'&#41;, 
	array&#40;'value2'=>'something2'&#41;, 
	array&#40;'value3'=> array&#40;'value'=>'something'&#41;&#41;, 
	'simple'=>'simplevalue' 
&#41;; 

$array_iterator = new RecursiveIteratorIterator&#40;new RecursiveArrayIterator&#40;$arr&#41;&#41;;
$new_array = array&#40;&#41;;
foreach &#40;$array_iterator as $key => $value&#41; &#123;
	$new_array&#91;$key&#93; = $value;
&#125;

print_r&#40;$arr&#41;;
print_r&#40;$new_array&#41;;
Ωστόσο ο τρόπος αυτός δεν θα κρατήσει το tree των keys όπως πχ 3-value3-value αλλά θα ορίσει το νέο key σκέτο value δηλαδή κρατάει το last key αν θες να το πούμε έτσι.

Αν πάλι θες να κρατήσεις το path των keys σου μπορείς να χρησιμοποιήσεις αυτό:

Κώδικας: Επιλογή όλων

<?php
$arr = array&#40; 
	array&#40;'value'=>'something'&#41;, 
	array&#40;'value1'=>'something1'&#41;, 
	array&#40;'value2'=>'something2'&#41;, 
	array&#40;'value3'=> array&#40;'value'=>'something'&#41;&#41;, 
	'simple'=>'simplevalue' 
&#41;; 

$new_array = array&#40;&#41;;

function _&#40;Array $array, Array &$new_array, $key = null&#41; &#123;
	foreach &#40;$array as $k => $v&#41; &#123;
		if &#40;!is_array&#40;$v&#41;&#41; &#123;
			$new_array&#91;&#40;&#40;null === $key&#41;?$k&#58;substr&#40;$key, 1&#41;."-&#123;$k&#125;"&#41;&#93; = $v;
		&#125; else &#123;
			_&#40;$v, $new_array, &#40;$key.'-'.$k&#41;&#41;;
		&#125;
	&#125;
&#125;

_&#40;$arr, $new_array&#41;;
print_r&#40;$new_array&#41;;
Το οποίο το έγραψα στα γρήγορα μπορεί με κάποιο array walker να τρέξει ποιο γρήγορα αλλά αν σ' ενδιαφέρει το τεστάρουμε ;)

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Multidimensional array to flat

Δημοσίευση από ThyClub » 25 Ιαν 2010 11:44

Πάνο ευχαριστώ για την απάντηση...

Με την SPL το είχα δοκιμάσει και ακριβώς επειδή δεν κρατούσε το path δεν την χρησιμοποιώ. Θα δοκιμάσω τον τρόπο σου. Με walk δοκίμασα αλλά μου φαίνεται πιο αργό, αν και πιο memory friendly... :D

Το array παίζει να έχει και 100.000 keys μέσα και είναι σημαντικό να γίνει γρήγορα η δουλειά και όσο το δυνατόν πιο ανάλαφρα :wink:

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης