Nasıl "dümdüz" için

9 Cevap php

Muhtemelen acemi bir soru ama ben zaten uzun süre belgelerinde geçiyor ve ben herhangi bir çözüm bulamıyor. Ben str_split yeni basit bir dizi yapmak için her boyut için çöktüğünü kullanın ve sonra tekrar birlikte bu dizeleri koymak düşündüm. Katılmak desen değerleri de değil ve böylece sonra str_split benim özgün değerleri kırabilir Ancak ben asla bilemezsiniz.

combine($array1, $array2), çok-boyutlu dizi içinde diziler için böyle bir şey var mı?

9 Cevap

Burada temiz ve verimli cevabı:

$array  = your array

$result = call_user_func_array('array_merge', $array);

echo "<pre>";
print_r($result);

REF: http://php.net/manual/en/function.call-user-func-array.php

Here is another solution (works with multi-dimensional array) :

function array_flatten($array) {

   $return = array();
   foreach ($array as $key => $value) {
       if (is_array($value)){ $return = array_merge($return, array_flatten($value));}
       else {$return[$key] = $value;}
   }
   return $return;

}

$array  = Your array

$result = array_flatten($array);

echo "<pre>";
print_r($result);

PHP ait bir başka yöntem, user comments (basitleştirilmiş) ve here,

function array_flatten_recursive($array) { 
   if (!$array) return false;
   $flat = array();
   $RII = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
   foreach ($RII as $value) $flat[] = $value;
   return $flat;
}

The big benefit of this method is that it tracks the depth of the recursion, should you need that while flattening.
This will output:

$array = array( 
    'A' => array('B' => array( 1, 2, 3)), 
    'C' => array(4, 5) 
); 
print_r(array_flatten_recursive($array)); 

#Returns: 
Array ( 
    [0] => 1 
    [1] => 2 
    [2] => 3 
    [3] => 4 
    [4] => 5 
)

A non-recursive çözüm (ama sırası-yok):

function flatten($ar) {
    $toflat = array($ar);
    $res = array();

    while (($r = array_shift($toflat)) !== NULL) {
    	foreach ($r as $v) {
    		if (is_array($v)) {
    			$toflat[] = $v;
    		} else {
    			$res[] = $v;
    		}
    	}
    }

    return $res;
}

PHP> = 5.3 ve Luc M cevabı (ilk) dayalı böyle kapanışları yararlanabilir içinde

array_walk_recursive($aNonFlat, function(&$v, $k, &$t){$t->aFlat[] = $v;}, $objTmp);

Ben create_function kullanırken gibi tırnak ile işlevin kodunu çevreleyen zorunda değilsiniz, çünkü bu aşk ()

Bu kullanımı kolay SUPER bir satır şudur:

$result = array();
array_walk_recursive($original_array,function($v, $k) use (&$result){ $result[] = $v; });

, Anlamak çok kolaydır anonim işlev / kapatma $ v içindeki değeri ve $ k orijinal dizinin anahtarıdır.

Eğer dizi anahtarları kaybetme ile tamam iseniz, array_values ​​() kullanan bir geri arama gibi bir özyinelemeli kapatma kullanarak çok boyutlu bir dizi dümdüz olabilir. Geri arama array_walk () veya array_walk_recursive () ya da birlikte çalışır.

$nu_array = null;
$callback = function ( $item ) use(&$callback, &$nu_array) {
    if (!is_array($item)) {
    $nu_array[] = $item;
    }
    else
    if ( is_array( $item ) ) {
     foreach( array_values($item) as $v) {
         if ( !(is_array($v))) {
             $nu_array[] = $v;
         }
         else
         { 
             $callback( $v );
         continue;
         }    
     }
    }
};

array_walk($array, $callback);
var_dump($nu_array);

Multiarrays dize anahtarlarını overwritting bir hatayı düzeltir kaos tarafından submited önceki örnekte işlevine dayalı yeni bir yaklaşım:

# Flatten a multidimensional array to one dimension, optionally preserving keys.
# $array - the array to flatten
# $preserve_keys - 0 (default) to not preserve keys, 1 to preserve string keys only, 2 to preserve all keys
# $out - internal use argument for recursion

function flatten_array($array, $preserve_keys = 2, &$out = array(), &$last_subarray_found) 
{
        foreach($array as $key => $child)
        {
            if(is_array($child))
            {
                $last_subarray_found = $key;
                $out = flatten_array($child, $preserve_keys, $out, $last_subarray_found);
            }
            elseif($preserve_keys + is_string($key) > 1)
            {
                if ($last_subarray_found)
                {
                    $sfinal_key_value = $last_subarray_found . "_" . $key;
                }
                else
                {
                    $sfinal_key_value = $key;
                }
                $out[$sfinal_key_value] = $child;
            }
            else
            {
                $out[] = $child;
            }
        }

        return $out;
}

Example:
$newarraytest = array();
$last_subarray_found = "";
$this->flatten_array($array, 2, $newarraytest, $last_subarray_found);

Bu deneyebilirsiniz:

function flat_an_array($a)
{
    foreach($a as $i)
    {
        if(is_array($i)) 
        {
            if($na) $na = array_merge($na,flat_an_array($i));
            else $na = flat_an_array($i);
        }
        else $na[] = $i;
    }
    return $na;
}