Çok boyutlu bir dizi yapısını idare etme

2 Cevap php

Bu aslında zaten çözdüm bir sorun, ama ben daha iyi bir çözüm olabilir şüpheli. Ben temelde (belirli bir sırayla) bir kategori ağacında tüm düğümlerin bir listesini gösterir iç içe bir dizi var:

Array(
    [0] => Array(
        [Category] => Array(
            [id] => 49
            [name] => Poster
        )
        [Child] => Array()
    )
    [1] => Array(
        [Category] => Array(
            [id] => 48
            [name] => Sticker
        )
        [Child] => Array()
    )
    [2] => Array(
        [Category] => Array(
            [id] => 46
            [name] => Hat
        )
        [Child] => Array()
    )
    [3] => Array(
        [Category] => Array(
            [id] => 45
            [name] => Hoodie
        )
        [Child] => Array()
    )
)

Sen $node['Child'] tüm durumlarda boş bir dizi olduğunu fark edeceksiniz. Zaten array_filter() dışı tüm yaprak düğümleri filtrelemek için kullanılan ettik çünkü bu. Yine de, ne ben sonuçta istiyorum böyle yaprak düğümlerin bir tek-boyutlu bir dizi sahip olmaktır:

Array(
    [49] => Poster
    [48] => Sticker
    [46] => Hat
    [45] => Hoodie
)

So what would be the most elegant way of converting the first array to the second array?

İsteğe bağlı olarak, aynı zamanda yaprak düğümleri ve non-yaprak düğümlerin hem de bir dizi ile başlar ve her iki deneyin dizi budamak ve yeniden olabilir. Olmayan bir yaprak düğüm örneğidir gibi bir şey olurdu:

[7] => Array(
    [Category] => Array(
        [id] => 36
        [name] => Merch
    )
    [Child] => Array(
        [0] => Array(
            [id] => 49
            [name] => Poster
        )
        [1] => Array(
            [id] => 48
            [name] => Sticker
        )
        [2] => Array(
            [id] => 40
            [name] => Apparel
        )
    )
)

Son olarak, ben CakePHP'ye kullanıyorum, bu yüzden CakePHP'nin Set sınıfının kullanımı da kabul edilebilir.

2 Cevap

Şık? Zarif tanımlayın. Bazı insanlar farklı olarak sadece mantıklı ve daha sonra kodun üzerine tökezleyerek herkese açıktır ne yapıyor bir golf yarışma içine bu açmak için gidiyoruz düşünüyorum:

$cats = array();
foreach($categories as $c) {
    $cats[$c['Category']['id']] = $c['Category']['name'];
}

Seni geri kendinizi pat ve hareket önermek durumda bu, ne var olduğunu sanıyorum.

Bu cevap zaten "zarif" olması amaçlanmıştır değil, ama "akıllı" kategorisi altında düşebilir varsayalım. (Not: zeki çözümler her zaman "iyi" çözümler değildir)

preg_match_all( "/\"name\";s:\d+:\"(.*?)\"/i", serialize( $arr ), $matches );

print_r( $matches[1] );

Tüm dürüstlük, özyinelemeli yineleme o korkunç verimli ya da özlü olmasa bile, netliği için en iyi seçimdir.

$arr = array(
    "0" => array(
        "Category" => array(
            "id" => 49
            ,"name" => Poster
        )
        ,"Child" => array()
    )
    ,"1" => array(
        "Category" => array(
            "id" => 48
            ,"name" => Sticker
        )
        ,"Child" => array()
    )
    ,"2" => array(
        "Category" => array(
            "id" => 46
            ,"name" => Hat
        )
        ,"Child" => array()
    )
    ,"3" => array(
        "Category" => array(
            "id" => 45
            ,"name" => Hoodie
        )
        ,"Child" => array(
            "0" => array(
                "id" => 49
                ,"name" => Poster
            )
            ,"1" => array(
                "id" => 48
                ,"name" => Sticker
            )
            ,"2" => array(
                "id" => 40
                ,"name" => Apparel
            )
        )
    )
);

findNames( $arr, $names );
echo '<pre>';
print_r( $names );
echo '</pre>';

function findNames( $source, &$out )
{
    foreach ( $source as $value )
    {
    	if ( isset( $value['name'] ) )
    	{
    		//	Assumes that if $value['name'] exists, $value['id'] must also exist
    		$out[$value['id']] = $value['name'];
    		continue;
    	}
    	if ( is_array( $value ) )
    	{
    		findNames( $value, &$out );
    	}
    }
}