使用静态方法调用(PHP)从数组数组创建对象数组

使用静态方法调用(PHP)从数组数组创建对象数组,php,class,static,Php,Class,Static,我有这样一个数组: // Define pages $pages = array( "home" => array( "title" => "Home page", "icon" => "home" ), "compositions" => array( "title" => "Composition page", "icon" => "music" ), );

我有这样一个数组:

// Define pages
$pages = array(
    "home" => array(
        "title" => "Home page",
        "icon" => "home"
    ),
    "compositions" => array(
        "title" => "Composition page",
        "icon" => "music"
    ),
);
foreach($navigation as $nav_item){
    echo $nav_item->page; // home(1st iter.), compositions(2nd iter.)
    echo $nav_item->title;// Home page, Composition page
    echo $nav_item->icon; // home, music
}
for ( $pages as $pageName => $pageObject ) echo $pageName . " has title: " . $pageObject->title;
我想实现的是:

$navigation = Utils::makeNavigation($pages);
,将
$navigation
创建为对象数组,以便我可以在视图中解析它 像这样:

// Define pages
$pages = array(
    "home" => array(
        "title" => "Home page",
        "icon" => "home"
    ),
    "compositions" => array(
        "title" => "Composition page",
        "icon" => "music"
    ),
);
foreach($navigation as $nav_item){
    echo $nav_item->page; // home(1st iter.), compositions(2nd iter.)
    echo $nav_item->title;// Home page, Composition page
    echo $nav_item->icon; // home, music
}
for ( $pages as $pageName => $pageObject ) echo $pageName . " has title: " . $pageObject->title;
static
Util-like类
方法适合这种问题吗

编辑

我想出了这样的办法,这样行吗

<?php
class Utils {

    protected static $_navigation;

    public static function makeNavigation($pages = array()){

        if (!empty($pages)){
            foreach ($pages as $page => $parts) {
                $item = new stdClass;
                $item->page = $page;

                foreach ($parts as $key => $value) {
                    $item->$key = $value;
                }
                self::$_navigation[] = $item;
            }
        return self::$_navigation;
        }
    }
}

假设您在代码中手动创建数组,只需强制转换到对象:

$pages = array(
    "home" => ( object ) array(
        "title" => "Home page",
        "icon" => "home"
    ),
    "compositions" => ( object ) array(
        "title" => "Composition page",
        "icon" => "music"
    ),
);
这将允许像访问对象一样访问它们:

$pages->home->title;
或者像这样循环:

// Define pages
$pages = array(
    "home" => array(
        "title" => "Home page",
        "icon" => "home"
    ),
    "compositions" => array(
        "title" => "Composition page",
        "icon" => "music"
    ),
);
foreach($navigation as $nav_item){
    echo $nav_item->page; // home(1st iter.), compositions(2nd iter.)
    echo $nav_item->title;// Home page, Composition page
    echo $nav_item->icon; // home, music
}
for ( $pages as $pageName => $pageObject ) echo $pageName . " has title: " . $pageObject->title;

我会将创建作为类的静态成员包括在内,以将特定于类的代码保持在一起:

class NavItem
{
//  Static member does not require an object to be called
static function create ($def)
{
    $ret = array ();
    foreach ($def as $idx=>$navDef)
        $ret [$idx] = new NavItem ($navDef);
    return $ret;
}
function __construct ($def)
{
    // Do something more specific with the current def (title, icon array)
    $this->param = $def;
}

function display ()
{
    //  Simple example
    echo $this->param ['title'];
    echo $this->param ['icon'];
}
    var                     $param;
};

//  Using your pages array as above
$pages = NavItem::create ($pages);
foreach ($pages as $idx=>$page)
    $page->display ();

区分“好”和“坏”的标准是什么?@zerkms请看我的编辑。.“好”是什么?能否客观地衡量?对一个人来说是“好的”,对另一个人来说是“不好的”。这对我来说“不好”——我会使用
array\u map
。这算是一个答案吗?你能举一个关于我的情况的小例子吗,关于你如何使用
数组_map
?我会使用它而不是我不想实现的循环,我举了一个例子,说明我希望最终得到什么。在一个
itetrable
对象中具有所有3个属性。你错过了我也需要的
页面
属性。