Düzeylerinin belirsiz bir sayıda nesne özellikleri

2 Cevap php

Bu soru this one benzer ama (gerçekten) başka bir seviyeye onu alır, ya da seviyeleri.

Arka plan: Kohana PHP framework am kullanarak, özel olarak ise, ORM library.

Temelde, onunla DB sonuçları döngü, bir nesnenin özellikleri olarak alan değerleri erişebilirsiniz zaman. Herhangi katıldı tablolar hiyerarşik bir şekilde ulaşılabilir. Örneğin:

$users = ORM::factory('user')->with('city')->with('city:country')->find_all();
foreach ($users as $user) {
    echo "<p>{$user->name} ({$user->city->name}, {$user->city->country->name})</p>";
}

çıktısı:

Kullanıcı 1 (City 1, Ülke 1)

Kullanıcı 2 (Şehir 2, Ülke 1)

Kullanıcı 3 (Şehir 2, Ülke 1)

Kullanıcı 4 (City 3, Ülke 2)

Kullanıcı 5 (City 4, Ülke 2)

vb

Şimdi, benim sorum: seviyelerinin herhangi bir sayı için bir nesnenin hiyerarşik özelliklerine erişmek için bir yol var. İdeal olarak, böyle bir şey yapmak istiyorum:

$users = ORM::factory('user')->with('city')->with('city:country')->find_all();
$var2 = 'name';
$var2 = 'city->name';
$var3 = 'city->country->name';
foreach ($users as $user) {
    echo "<p>" . $user->{$var1} . "(" . $user->{$var2} . ", " . $user->{$var3} . ")</p>";
}

Bu Özlediğim bazı basit bir şekilde mümkün mü?

Çok teşekkürler!

2 Cevap

Bu deneyin:

$users = ORM::factory('user')->with('city')->with('city:country')->find_all();
$var1 = 'name';
$var2 = 'city.name';
$var3 = 'city.country.name';
foreach ($users as $user) {
    $user = $user->as_array();
    echo "<p>" . Arr::path($user, $var1)  . "(" . Arr::path($user, $var2) . ", " . Arr::path($user, $var3) . ")</p>";
}

Arr:path (Kohana belgelerine alınan) ne yaptığını anlamak için:

// Get the value of $array['foo']['bar']
$value = Arr::path($array, 'foo.bar');

EDIT:

The above solution is for Kohana v3. For Kohana 2.3.4, see the third post on this page.

Tamam, ben bu kırık ettik.

Ben bu yüzden böyle bir işlevi yazdık:

public static function get_attribute($object, $level)
{
    $level = explode('->', $level);
    if (count($level) == 1) {
        return $object->{$level[0]};
    } else {
        $object = $object->{$level[0]};
        unset($level[0]);
        return self::get_attribute($object, implode('->', $level));
    }
}

Tanrı özyineleme korusun.