【问题标题】:Merge two arrays together tagged by same id将两个由相同 id 标记的数组合并在一起
【发布时间】:2021-03-11 14:56:16
【问题描述】:

我在将两个数组组合在一起时遇到了问题。 一个数组我有问题,另一个是答案。

array_merge() 不起作用,因为我丢失了一些键 + 值。 还有array_intersect_key()不是我想要的,希望有人能帮帮我。

两个数组都有键 [questionid] 这是我要定位的键。

数组 1(答案);

Array
(
    [0] => Array
        (
            [questionid] => 28f68dc4-acc6-4ab7-956d-ca41abf3a4c2
            [answer] => Antwoord 89
            [extra] => 
        )

    [1] => Array
        (
            [questionid] => 28f-28f68dc4-acc6-4ab7-956d-ca41abf3a4c20
            [answer] => Antwoord 20
            [extra] => Extra informatie 20
        )

    [2] => Array
        (
            [questionid] => d8f-28f68dc4-acc6-4ab7-956d-ca41abf3a4c20
            [answer] => Antwoord 3
            [extra] => 
        )

)

还有一个带有问题的数组:

       (
            [0] => Array
                (
                    [questionId] => 28f-28f68dc4-acc6-4ab7-956d-ca41abf3a4c20
                    [question] => 1. Question 1
                    [type] => typequestion/question-text-input
                )

        )

最终的数组应该是这样的:

Array
(
    [0] => Array
        (
            [questionid] => 28f68dc4-acc6-4ab7-956d-ca41abf3a4c2
            [answer] => Antwoord 89
            [extra] => 
        )

    [1] => Array
        (
            [questionid] => 28f-28f68dc4-acc6-4ab7-956d-ca41abf3a4c20
            [answer] => Antwoord 20
            [extra] => Extra informatie 20
            [question] => 1. Question 1
            [type] => typequestion/question-text-input
        )

    [2] => Array
        (
            [questionid] => d8f-28f68dc4-acc6-4ab7-956d-ca41abf3a4c20
            [answer] => Antwoord 3
            [extra] => 
        )

)

【问题讨论】:

    标签: php arrays merge


    【解决方案1】:

    您可以开始为问题创建一个索引数组以找到它们。然后,您可以遍历答案并将问题数据添加到当前答案:

    $indexedQuestions = [];
    foreach ($questions as $question) {
        $id = $question['questionId'];
        $indexedQuestions[$id] = $question;
    }
    
    $combined = [];
    foreach ($answers as $answer) {
        $id = $answer['questionid'];
        if (isset($indexedQuestions[$id])) {
            $combined[] = $answer + $indexedQuestions[$id];
        } else {
            $combined[] = $answer;
        }
    }
    

    example

    如果要更新$answers数组,可以使用&通过引用更新$answer

    foreach ($answers as &$answer) {
        $id = $answer['questionid'];
        if (isset($indexedQuestions[$id])) {
            $answer += $indexedQuestions[$id];
        }
    }
    

    example

    请注意,questionidquestionId 不同,因此您将在组合数组中获得这两个键。您可以使用unset() 删除其中一个,例如this example

    【讨论】:

    • 这个也可以!感谢您的快速反应,我想我会使用这个因为得到一个组合数组:)
    【解决方案2】:

    一种简单的foreach()循环和array_search()。这里数组搜索将在 questionId 存在的$answers 数组上找到,然后将 questiontype 放到主要的$questions数组。

    注意:我在答案数组中看到 questionIdI 大写

    foreach($questions as $key=>$value){
        $k = array_search($value['questionid'], array_column($answers, 'questionId'));
        if($k!==FALSE)){
            $questions[$key]['question'] = $answers[$k]['question'];
            $questions[$key]['type'] = $answers[$k]['type'];
        }
    }
    print_r($questions);
    

    工作演示: https://3v4l.org/O4uDc

    不修改主数组,

    $combineArray = [];
    foreach($questions as $key=>$value){
        $combineArray[$key] = $value;
        $k = array_search($value['questionid'], array_column($answers, 'questionId'));
        if($k!==FALSE){
            $combineArray[$key]['question'] = $answers[$k]['question'];
            $combineArray[$key]['type'] = $answers[$k]['type'];
        }
    }
    print_r($combineArray);
    

    工作演示: https://3v4l.org/9vhla

    【讨论】:

    • 这个对我有用,但是否可以只创建一个像 $combineArray 这样的新数组而不是更改问题。
    • @Gurdt 延迟更新,但它应该可以在不使用另一个数组修改主数组的情况下工作,例如你所说的 $combinedArray。
    • 也添加了该工作演示。希望它会有所帮助:)
    猜你喜欢
    • 2020-05-09
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2018-10-30
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多