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 № 1To, 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