(Ebeveyn dizinin alt dizileri mağaza endeksi nerede) çok boyutlu düz gelen dizi yeniden?

2 Cevap php

Ben düz bir dizi çekmek ve çok boyutlu olduğunu bu yüzden onu yeniden çalışıyorum. Ben array_combine ve array_merge bakarak oldum, ama o ya ben umut ediyorum bana ne verecek emin değilim ...

Dizi içinde geçerli formu (ve bu sadece basitleştirilmiş bir örnektir):

Array
(
    [0] => stdClass Object
        (
            [tid] => 31
            [name] => Safeway
            [parents] => Array
                (
                    [0] => 0
                )

        )

    [1] => stdClass Object
        (
            [tid] => 32
            [name] => Dairy
            [parents] => Array
                (
                    [0] => 31
                )

        )

    [2] => stdClass Object
        (
            [tid] => 33
            [name] => Milk
            [parents] => Array
                (
                    [0] => 32
                )

        )
)

Her nesne, ebeveyni bir altdizilim olan çok boyutlu bir dizi oluşturmak için çalışıyorum. Yani, yukarıdaki örnekte, çıkış için çalışıyorum:

Array
(
    [0] => stdClass Object
        (
            [tid] => 31
            [name] => Safeway
            [children] => Array
                (
                    [tid] => 32
                    [name] => Dairy
                    [children] => Array
                        (
                            [tid] => 33
                            [name] => Milk
                        )
                )

        )
)

2 Cevap

Öncelikle, ne gösteren bir boyutlu bir dizi, ama stdclass nesnelerin bir dizi değil.

Eğer onları gerçekten diziler yapmak ile sorun değil o zaman bu bunu yapmak olabilir:

// initiate result array
$multiArray = array();

// assume $items is your current array
foreach( $items as $item )
{
    // cast StdClass to array
    $objToArray = (array) $item;

    // if this item is initiated already merge it with the current item
    $multiArray[ $objToArray[ 'tid' ] ] = isset( $multiArray[ $objToArray[ 'tid' ] ] ) ? $multiArray[ $objToArray[ 'tid' ] ] + $objToArray : $objToArray;

    foreach( $objToArray[ 'parents' ] as $parentId )
    {
        // if parents don't exist yet, initiate them
        if( !isset( $multiArray[ $parentId ] ) )
        {
            $multiArray[ $parentId ] = array(
                'children' => array()
            );
        }

        // add this item to the parents children collection by reference (for efficiency)
        $multiArray[ $parentId ][ 'children' ][ $objToArray[ 'tid' ] ] = &$multiArray[ $objToArray[ 'tid' ] ];
    }
}

Bu ile kolayca ile kimliği öğeleri bulabilirsiniz:

$item = $multiArray[ $someId ];

Ve bir çocuk almak için:

$child = $item[ 'children' ][ $someChildId ];

Ya da tüm çocuklar:

$children = $item[ 'children' ];

EDIT
Ok, I've tested it now, and it seems to work fine after adding some missing semicolons.

Tamam, ben burada bazı varsayımlar yapıyorum:

  • Her eleman sadece 1 ebeveyne sahip, yani parents dizisi sadece 1 tid olacak
  • Dizi çocuklar sadece ebeveynlerinin sonra görünecektir böyle sıralanır
  • Üst düzey elmenets parent = 0 olacak

Göz önüne alındığında, bu kodu deneyin:

$original = array ( ... your original array ... );
$nested = array ();

$n = count($original);
for ($i = 0; $i < $n; ++$i)
{
    $nested[$original[$i]->tid] = $original[$i];
    $nested[$original[$i]->tid]->children = array ();
}

while ($n-- && $current = $original[$n])
    if ($current->parents[0] != 0 && $current->parents[0] != $current->tid)
    {
        $nested[$current->parents[0]]->children[] = $current;
        unset ($nested[$current->tid]);
    }