/ / Próba wyciągnięcia wszystkich wartości z wielowymiarowej (rekurencyjnej) tablicy - php, tablice

Próba wyciągnięcia wszystkich wartości z wielowymiarowej (rekursywnej) tablicy - php, tablic

Próbuję utworzyć jedną tablicę, która zawiera wszystkie wartości istniejącej tablicy wielowymiarowej. Oto co mam do tej pory:

function MaxArray($arr) {

foreach ($arr as $value) {

if (is_array($value)) {
MaxArray($value);
} else {
$array[] = $value;
}
}
print_r($array);

}

$arr = array(array(141,151,161), 2, 3, array(101, 202, array(303,404, array(1,2))));

MaxArray($arr);

Kiedy wykonuję ten kod, otrzymuję tę odpowiedź z funkcji print_r ...

Array ( [0] => 141 [1] => 151 [2] => 161 ) Array ( [0] => 1 [1] => 2 ) Array ( [0] => 303 [1] => 404 ) Array ( [0] => 101 [1] => 202 ) Array ( [0] => 2 [1] => 3 )

Jak widać, nie tego szukami nie mogę wymyślić, jak połączyć wszystkie wartości z tablicy wielowymiarowej w jedną tablicę. Czy ktoś mógłby tutaj wskazać mi właściwy kierunek?

Odpowiedzi:

5 dla odpowiedzi № 1

To, co próbujesz zrobić, jest często nazywane „spłaszczaniem tablicy”, więc ArrayFlatten jest prawdopodobnie lepszą nazwą dla funkcji niż MaxArray (ponieważ to ostatnie brzmi tak, jakby „zwróci najwyższą wartość w tablicy, co max robi bardzo dobrze). ArrayFlatten można napisać tak:

function ArrayFlatten($array, $return) {
for ($x = 0; $x < count($array); $x++) {
if(is_array($array[$x])) {
$return = ArrayFlatten($array[$x], $return);
}
else {
if($array[$x]) {
$return[] = $array[$x];
}
}
}

return $return;
}

I używane w ten sposób:

$myarray = array("a","b",array(array(array("x"),"y","z")),array(array("p")));
$res = ArrayFlatten($myarray,array());

Aby to uzyskać:

Szyk ( [0] => a [1] => b [2] => x [3] => y [4] => z [5] => p )

Od tutaj.


0 dla odpowiedzi nr 2

$ tablica jest odtwarzana i drukowana w każdymwykonanie MaxArray (). Musisz zbudować go na wszystkich rekurencyjnych wykonaniach. Myślę, że najlepszym sposobem na to jest, aby funkcja MaxArray () zwróciła tę tablicę, zamiast ją wydrukować. ... i kiedy to piszę, Dominic Rodger właśnie to dla ciebie zrobił!


0 dla odpowiedzi № 3

Oto kolejny wariant ilustrujący użycie foreach i zachowanie (niektórych) kluczy ciągów.

function array_flatten($array) {
$rslt = array();
foreach ($array as $key => $val) {
if (is_array($val)) {
$rslt = array_merge($rslt, array_flatten($val));
} elseif (is_int($key)) {
$rslt[] = $val;
} else {
// for string keys, earlier values are overwritten with later ones
$rslt[$key] = $val;
}
}
return $rslt;
}

Aby uzyskać różne zachowanie kolizji, zmień $rslt[$key] = $val; linia.


0 dla odpowiedzi nr 4

jeśli chcesz tylko wypisać maksymalną wartość tablicy rekurencyjnej, użyj tego

function MaxArray($arr) {
$max = 0;
foreach($arr as $a)
{
if(is_array($a)) {
$max = MaxArray($a);
} else if($a > $max){
$max = $a;
}
}
return $max;
}

0 dla odpowiedzi № 5

Funkcja powinna odwoływać się do tablicy wyników, która nigdy się nie zmieni.

function flatten($cur, & $result) { ... flatten($x, $result); ... }

Oto przykład: http://davidwalsh.name/flatten-nested-arrays-php