Cakephp如何使用Set Class创建一个assoc数组?

时间:2010-04-07 09:58:45

标签: cakephp

我有一个$ Model-> find()查询的输出数组,它也从hasMany关系中提取数据:

Array(
[Parent] => Array
            (
                [id] => 1
            )

[Child] => Array
            (
                [0] => Array
                    (
                        [id] => aaa
                        [score] => 3
                        [src] => stage6/tn~4bbb38cc-0018-49bf-96a9-11a0f67883f5.jpg
                        [parent_id] => 1
                    )

                [1] => Array
                    (
                        [id] => bbb
                        [score] => 5
                        [src] => stage0/tn~4bbb38cc-00ac-4b25-b074-11a0f67883f5.jpg
                        [parent_id] => 1
                    )

                [2] => Array
                    (
                        [id] => ccc
                        [score] => 2
                        [src] => stage4/tn~4bbb38cc-01c8-44bd-b71d-11a0f67883f5.jpg
                        [parent_id] => 1
                    )

     )
)

我想将此输出转换为类似的内容,其中child id是其他子属性的关键:

Array(
[aaa] => Array
    (
        [score] => 3
        [src] => stage6/tn~4bbb38cc-0018-49bf-96a9-11a0f67883f5.jpg
    )
[bbb] => Array
    (
        [score] => 5
        [src] =>  stage0/tn~4bbb38cc-00ac-4b25-b074-11a0f67883f5.jpg
    )
[ccc] => Array
    (
        [score] => 2
        [src] => stage4/tn~4bbb38cc-01c8-44bd-b71d-11a0f67883f5.jpg
    )

}

有没有一种简单的方法可以使用Set :: extract,Set :: combine,Set :: insert等来有效地执行此操作?我无法理解。

2 个答案:

答案 0 :(得分:2)

我已经使用Set::combine这样做了几次,但我不能为效率做出论证。举个例子,我有一份志愿者名单,每个志愿者都属于一个团体。我想检索每个委员会及其志愿者,但作为一个由委员会名称键入的关联数组。这是我过去常用的代码:

$volunteers = Set::combine (
  $this->Volunteer->Committee->find (
    'all',
    array ( 'order' => 'display_order' )
  ),
  '{n}.Committee.title',
  '{n}.Volunteer'
);

希望这会有所帮助。 documentation for Set::combine可能有助于详细说明细节。

答案 1 :(得分:1)

正如罗布所说,Set::combine是你问题的答案。这是一个使用XPath 2.0语法的示例解决方案:

$parents = $this->Parent->find('all');
$assocChildren = Set::combine( $parents, '/Child/id', '/Child' );