【问题标题】:pop and push from one associative array to another array从一个关联数组弹出并推送到另一个数组
【发布时间】:2017-07-06 20:35:24
【问题描述】:

我想从array2 中弹出并想推入array1。 但根据一些定制要求。

现在在 array1 中,第一个键的 readingOrder 为 1,第二个键的 readingOrder 为 4。

所以我想从array2的前两个键中推动这两个键。其他所有键的过程相同。

我的最终数组必须像 array3。

例如在array1 中key[0] 的readOrder 是1,key[1] 是4。现在我想从array2 中再推两个键。 对于 array1 键 [2] 的读取顺序是 6。所以在此键之前我想从 array2 中按下另一个键,并且相同以进一步...

array1 如下所示

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

    [1] => Array
        (
            [readingOrder] => 4
            [id] => 76
        )

    [2] => Array
        (
            [readingOrder] => 6
            [id] => 80
        )

)

array2 如下所示

Array
(
    [0] => Array
        (
            [id] => 81
            [readingOrder] => 2
        )

    [1] => Array
        (
            [id] => 82
            [readingOrder] => 5
        )

    [2] => Array
        (
            [id] => 84
            [readingOrder] => 7
        )

    [3] => Array
        (
            [id] => 85
            [readingOrder] => 8
        )

    [4] => Array
        (
            [id] => 86
            [readingOrder] => 9
        )

    [5] => Array
        (
            [id] => 87
            [readingOrder] => 10
        )

    [6] => Array
        (
            [id] => 88
            [readingOrder] => 11
        )

)

输出数组3:

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

    [1] => Array
        (
            [id] => 81
            [readingOrder] => 2
        )

    [2] => Array
        (
            [id] => 82
            [readingOrder] => 5
        )

    [3] => Array
        (
            [readingOrder] => 4
            [id] => 76
        )

    [4] => Array
        (
            [id] => 84
            [readingOrder] => 7
        )

    [5] => Array
        (
            [readingOrder] => 6
            [id] => 80
        )

    [6] => Array
        (
            [id] => 85
            [readingOrder] => 8
        )

    [7] => Array
        (
            [id] => 86
            [readingOrder] => 9
        )

    [8] => Array
        (
            [id] => 87
            [readingOrder] => 10
        )

    [9] => Array
        (
            [id] => 88
            [readingOrder] => 11
        )

)

谢谢..

【问题讨论】:

  • 您之前为获得正确输出所做的尝试是什么样的?更具体地说,您要解决什么问题?
  • @GordonM 我编辑我的问题。请立即阅读。
  • 您不明白@GordonM 的问题,问题是:您需要这样做的原因是什么? (以及您能否展示您解决问题的尝试?)

标签: php arrays sorting arraylist


【解决方案1】:

你可以这样构建你的数组:

$current = 1;
$arr3 = [];
while ( $arr1 && $arr2 ) {
    if ( $arr1[0]['readingOrder'] > $current )
        $arr3[] = array_shift($arr2);
    else
        $arr3[] = array_shift($arr1);
    $current++;
}

$arr3 = array_merge($arr3, $arr1, $arr2);

print_r($arr3);

请注意,此代码对$arr1 和$arr2 具有破坏性。如果您想保留它们,请先复制它们,然后再使用副本。

【讨论】:

  • 非常感谢。这个答案完全符合我的要求。
【解决方案2】:

您可以使用usort 执行此操作。首先你需要合并数组:

$a1 = [
    [
        'readingOrder' => 1,
        'id' => 78
    ],
    [
        'readingOrder' => 4,
         'id' => 76
    ],
    [
        'readingOrder' => 6,
        'id' => 80
    ]
];
$a2 = [
    [
        'readingOrder' => 2,
        'id' => 81
    ],
    [
        'readingOrder' => 5,
        'id' => 82
    ],
    [
        'readingOrder' => 7,
        'id' => 84
    ],
    [
        'readingOrder' => 8,
        'id' => 85
    ]
];

$a3 = array_merge($a1, $a2);

那你需要使用usort:

usort($a3, function($a,$b) {
    if ($a['readingOrder'] == $b['readingOrder']) return 0;
    return $a['readingOrder'] < $b['readingOrder'] ? -1 : 1;
});

在 PHP 7 中,您现在可以使用 spaceship 运算符,这将使代码更加简洁。像这样:

usort($a3, function($a,$b) {
    return $a[0] <=> $b[0];
});

这将返回:

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

    [1] => Array
        (
            [readingOrder] => 2
            [id] => 81
        )

    [2] => Array
        (
            [readingOrder] => 4
            [id] => 76
        )

    [3] => Array
        (
            [readingOrder] => 5
            [id] => 82
        )

    [4] => Array
        (
            [readingOrder] => 6
            [id] => 80
        )

    [5] => Array
        (
            [readingOrder] => 7
            [id] => 84
        )

    [6] => Array
        (
            [readingOrder] => 8
            [id] => 85
        )

)

【讨论】:

  • 这不是他要求的。
  • @CasimiretHippolyte 那我不好。我必须说,他想要达到的目标也不是很清楚。
  • 想要的结果很清楚,但他想要这样做的原因却是个谜。
  • @CasimiretHippolyte 结果让我不清楚哈哈
  • 实际上我想保持 array1 的读数顺序不变。从array2我想推剩余的地方..
猜你喜欢
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2013-01-14
  • 2016-07-03
  • 2020-08-23
  • 1970-01-01
  • 2015-02-16
相关资源
最近更新 更多