PHP çok boyutlu dizi Özü yaprak düğümleri

5 Cevap php

Şöyle PHP bir dizi var varsayalım

array
(
   array(0)
   (
       array(0)
       (
         .
         . 
         .
       )

       .
       .
       array(10)
       (
         ..
       )
   )

   .
   . 
   .
   array(n)
   (

     array(0)
     (
     )
   )
 )

Ve ben böyle böyle nasıl özyinelemeye başvurmadan bunu hakkında gitmeli doğrusal bir diziye bu mulit boyutlu bir dizinin tüm yaprak unsurları, ihtiyaç?

 function getChild($element)
 {

     foreach($element as $e)
     {

       if (is_array($e)
       {
          getChild($e);
       }
     }
 }

Not: Yukarıdaki kod parçacığını, korkunç incompleted

Güncelleme: Dizinin örneği

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => Seller Object
                        (
                            [credits:private] => 5000000
                            [balance:private] => 4998970
                            [queueid:private] => 0
                            [sellerid:private] => 2
                            [dateTime:private] => 2009-07-25 17:53:10
                        )

                )

        )

... Snipped.

[2] => Array
    (
        [0] => Array
            (
                [0] => Seller Object
                    (
                        [credits:private] => 10000000
                        [balance:private] => 9997940
                        [queueid:private] => 135
                        [sellerid:private] => 234
                        [dateTime:private] => 2009-07-14 23:36:00
                    )

            )

    .... Snipped....

    )

)

5 Cevap

Aslında, en manuel sayfasını kontrol, hile yapacak bir tek işlevi vardır: http://php.net/manual/en/function.array-walk-recursive.php

Sayfasından uyarlanmıştır Hızlı pasajı:

$data = array('test' => array('deeper' => array('last' => 'foo'), 'bar'), 'baz');

var_dump($data);

function printValue($value, $key, $userData) 
{
	//echo "$value\n";
	$userData[] = $value;
}


$result = new ArrayObject();
array_walk_recursive($data, 'printValue', $result);

var_dump($result);

Örneğin, iterators kullanabilirsiniz:

$result = array();
foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($array), RecursiveIteratorIterator::LEAVES_ONLY) as $value) {
    $result[] = $value;
}

Bir yığın kullanın:

<?php

$data = array(array(array("foo"),"bar"),"baz");

$results = array();
$process = $data;
while (count($process) > 0) {
    $current = array_pop($process);
    if (is_array($current)) {
        // Using a loop for clarity. You could use array_merge() here.
        foreach ($current as $item) {
            // As an optimization you could add "flat" items directly to the results array here.
            array_push($process, $item);
        }
    } else {
        array_push($results, $current);
    }
}

print_r($results);

Çıktı:

Array
(
    [0] => baz
    [1] => bar
    [2] => foo
)

Bu özyinelemeli yaklaşım daha verimli daha fazla bellek olmalıdır. Gerçek verilerin gerçek zvals bellekte çoğaltılamaz olmayacaktır yüzden biz burada dizi manipülasyon bir sürü yapmak olmasına rağmen, PHP kopya-on-write semantik sahiptir.

Bu deneyin:

function getLeafs($element) {
    $leafs = array();
    foreach ($element as $e) {
        if (is_array($e)) {
            $leafs = array_merge($leafs, getLeafs($e));
        } else {
            $leafs[] = $e;
        }
    }
    return $leafs;
}


Edit Görünüşe göre bir özyinelemeli çözüm istemiyoruz. Yani burada bir yığın kullanan bir iteratif çözüm:

function getLeafs($element) {
    $stack = array($element);
    $leafs = array();
    while ($item = array_pop($stack)) {
        while ($e = array_shift($item)) {
            if (is_array($e)) {
                array_push($stack, array($item));
                array_push($stack, $e);
                break;
            } else {
                $leafs[] = $e;
            }
        }
    }
    return $leafs;
}

Doğrudan yaprakları almak için hiçbir dümdüz işlevi yoktur. Daha dizi çocuk varsa her dizi için kontrol ve özyineleme kullanmak zorunda sadece bir sonuç düz dizi öğe taşımak altına almak zaman.