【问题标题】:CakePHP Fastest and better merge arraysCakePHP 最快更好的合并数组
【发布时间】:2014-03-23 13:51:19
【问题描述】:

我有两个数组(相同的模型),如下所示:

Array (
    [0] => Array (
        [id] => 17
        [user_id] => 1
    )
    [1] => Array (
        [id] => 8
        [user_id] => 1
    )
    [2] => Array  (
        [id] => 9
        [user_id] => 1
    )
)

Array (
    [0] => Array (
        [Post] => Array (
            [id] => 9
            [name] => name1
            [slug] => slug1
        )
    )
    [1] => Array (
        [Post] => Array (
            [id] => 17
            [name] => other name
            [slug] => other_slug
        )
    )
    [2] => Array (
        [Post] => Array (
            [id] => 8
            [name] => lorem
            [slug] => lorem_slug
        )
    )
)

如何按字段id 合并这两个数组,格式类似于第一个数组?

【问题讨论】:

    标签: sorting cakephp merge array-merge


    【解决方案1】:

    我仍在寻找更优雅的解决方案,但这个似乎可行。

    $a1 = [
        ['id' => 17, 'user_id' => 1],
        ['id' => 8, 'user_id' => 2],
        ['id' => 9, 'user_id' => 3],
    ];
    
    $a2 = [
        ['Post' => ['id' => 9, 'name' => 'name1', 'slug' => 'slug1']],
        ['Post' => ['id' => 17, 'name' => 'other name', 'slug' => 'other_slug']],
        ['Post' => ['id' => 8, 'name' => 'lorem', 'slug' => 'lorem_slug']],
    ];
    $a2 = Hash::extract($a2, '{n}.Post');
    
    foreach ($a1 as $key => $value) {
        $a1['id_' . $value['id']] = $value;
        unset($a1[$key]);
    }
    
    foreach ($a2 as $key => $value) {
        $a2['id_' . $value['id']] = $value;
        unset($a2[$key]);
    }
    
    $a3 = array_values(array_replace_recursive($a1, $a2));
    debug($a3);
    

    第二种更简单的方法:

    foreach ($a1 as &$item) {
        foreach ($a2 as $item2) {
            if ($item2['Post']['id'] == $item['id']) {
                $item = array_merge($item, $item2['Post']);
            }
        }
    }
    

    【讨论】:

    • 我尝试最小化使用 foreach(Hash 方法也使用 foreach)。
    • 第一个数组从何而来?
    • 均来自模型,但首先是 HABTM 结果,其次是 find('all')。
    • 我认为你的代码更好,因为只有 Hash::extract 运行 3 个 foreach,谢谢!
    • 我可以使用foreach ($a1 as &$item) { 然后$item=...foreach ($a1 as $order => $result) {$a1[$order],就像你做的那样
    【解决方案2】:

    我现在使用这样的一些:

    foreach ($a1 as $order => $result) {
        $a1[$order] = array_merge($a1[$order], current(Hash::extract($a2, '{n}.Post[id=' . $result['id'] . ']')));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 2021-06-11
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      相关资源
      最近更新 更多