【问题标题】:merge a part of array recursive php合并数组递归php的一部分
【发布时间】:2016-05-11 15:51:05
【问题描述】:

我尝试用谷歌搜索它,但找不到任何接近的东西。 是否可以合并两个数组但实际上是第二个数组的一部分?

这些数组会很长,第二个我只想使用第二个数组中的类别并首先合并!

我的数组:

$ar1 = array(
    "locale" => "en-US",
    "id" => 1,
    "categories" => array(
        "0" => array("name" => "abc", "username" => "abc1"),
        "1" => array("name" => "cdf", "username" => "bbb3"),
    )
);

$ar2 = array(
    "locale" => "en-US",
    "id" => 1,
    "categories" => array(
        "0" => array("name" => "xyz", "username" => "xyz4"),
        "1" => array("name" => "zyx", "username" => "xtt44"),
    )
);

我尝试了 array_mergearray_merge_recursive,但它不起作用。

我来了

Array
(
    [locale] => Array
        (
            [0] => en-US
            [1] => en-US
        )

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

    [categories] => Array
        (
            [0] => Array
                (
                    [name] => abc
                    [username] => abc1
                )

            [1] => Array
                (
                    [name] => cdf
                    [username] => bbb3
                )

            [2] => Array
                (
                    [name] => xyz
                    [username] => xyz4
                )

            [3] => Array
                (
                    [name] => zyx
                    [username] => xtt44
                )

        )

)

但这就是我想要的:

Array
(
    [locale] => Array
        (
            [0] => en-US
        )

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

    [categories] => Array
        (
            [0] => Array
                (
                    [name] => abc
                    [username] => abc1
                )

            [1] => Array
                (
                    [name] => cdf
                    [username] => bbb3
                )

            [2] => Array
                (
                    [name] => xyz
                    [username] => xyz4
                )

            [3] => Array
                (
                    [name] => zyx
                    [username] => xtt44
                )

        )

)

【问题讨论】:

  • 使用foreach循环你需要设计一个新数组。
  • 我可以避免使用 foreach 吗?我没有其他办法吗?
  • 每个数组都有相同的索引,所以在每个数组函数中你只有一个值。
  • 是的,这是主要问题:(
  • 继续提问吧……也要养成接受有用答案的习惯。

标签: php arrays array-merge


【解决方案1】:

这可能不是内置函数。是的;它只是一个带有分支条件的嵌套循环。 测试它...看看(最重要的是)它是否能满足您的需求...剩下的就是选择问题:简单优于复杂。

这里是给定的数组:$ar1$ar2

    <?php

        $ar1 = array(
            "locale" => "en-US",
            "id" => 1,
            "categories" => array(
                "0" => array("name" => "abc", "username" => "abc1"),
                "1" => array("name" => "cdf", "username" => "bbb3"),
            )
        );

        $ar2 = array(
            "locale" => "en-US",
            "id" => 1,
            "categories" => array(
                "0" => array("name" => "xyz", "username" => "xyz4"),
                "1" => array("name" => "zyx", "username" => "xtt44"),
            )
        );

这里是循环构造:

    <?php

        $arrResult  = array();

        foreach($ar1 as $key=>$value){
            if(!array_key_exists($key, $arrResult)){

                if(is_array($value)){
                    $arrResult[$key] = array();
                    for($i=0; $i<count($value); $i++){
                        $arrResult[$key][] = $value[$i];
                    }
                }else{
                    $arrResult[$key] = $value;
                }

                foreach ($ar2 as $index => $item) {
                    if(!array_key_exists($index, $arrResult)){
                        if(is_array($item)){
                            if($key == $index) {
                                $arrResult[$index] = array();
                                for ($j = 0; $j < count($item); $j++) {
                                    $arrResult[$key][] = $item[$j];
                                }
                            }
                        }
                    }else{
                        if(is_array($item)){
                            if($key == $index) {
                                for ($j = 0; $j < count($item); $j++) {
                                    array_push($arrResult[$index], $item[$j]);
                                }
                            }
                        }else{
                            $arrResult[$index] = $item;
                        }
                    }
                }

            }
        }

        var_dump($arrResult);

?>

这是 var_dump() 的输出:

    array (size=3)
        'locale' => string 'en-US' (length=5)
        'id' => int 1
    'categories' =>
    array (size=4)
        0 =>
        array (size=2)
            'name' => string 'abc' (length=3)
            'username' => string 'abc1' (length=4)
        1 =>
        array (size=2)
            'name' => string 'cdf' (length=3)
            'username' => string 'bbb3' (length=4)
        2 =>
        array (size=2)
            'name' => string 'xyz' (length=3)
            'username' => string 'xyz4' (length=4)
        3 =>
        array (size=2)
            'name' => string 'zyx' (length=3)
            'username' => string 'xtt44' (length=5)

我仍然相信您可能需要根据您的用例和偏好添加自己的逻辑(如果您喜欢的话)。

【讨论】:

  • 我试过了,这正是我想要的:)。感谢您的解决方案。
【解决方案2】:

您可能想要使用array_replacearray_replace_recursive。 或者我最近写的这个函数(根据网上找的一些代码):https://gist.github.com/jehaby/e91b6d35661ba8900644e5d64cc0055b

【讨论】:

  • 尝试了你的 git 函数,它替换了我的数组并发送给我:prntscr.com/b2trfx 但如果我更改我的密钥,它适用于所有函数 prntscr.com/b2trlw (array_merge, array_merge_recursive)
【解决方案3】:

array_combine 或者像这样使用 array_merge:

array_merge($ar1, $ar2['categories']);

【讨论】:

  • 啊,对不起,我没看到。看起来你从 Stas Makraov 那里得到了一个可行的解决方案,对吧?
【解决方案4】:

你需要在这里使用 foreach 循环。因为你的索引是相似的。

$result = array();

$result['locale'] = array('en-US');
$result['id'] = array(1);
foreach($ar1['categories'] as $val){
    $result['categories'][] = array('name' => $val['name'], 'username' => $val['username']);
}

foreach($ar2['categories'] as $val){
    $result['categories'][] = array('name' => $val['name'], 'username' => $val['username']);
}

echo '<pre>';
print_r($result);

结果

Array
(
    [locale] => Array
    (
        [0] => en-US
    )

    [id] => Array
    (
        [0] => 1
    )
    [categories] => Array
        (
            [0] => Array
                (
                    [name] => abc
                    [username] => abc1
                )

            [1] => Array
                (
                    [name] => cdf
                    [username] => bbb3
                )

            [2] => Array
                (
                    [name] => xyz
                    [username] => xyz4
                )

            [3] => Array
                (
                    [name] => zyx
                    [username] => xtt44
                )

        )

)

【讨论】:

  • 这可能是正确的,但正如我所说,我有一长串数组,这只是一部分。我无法像您使用 $result['locale'] = array('en-US'); 那样手动复制数组的一部分$result['id'] = array(1);这不会解决问题。
猜你喜欢
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多