以数组值作为键的数组合并

时间:2018-07-09 05:47:47

标签: php arrays multidimensional-array array-merge

我正在尝试转换产品数据的多维数组,其中将PayPal电子邮件设置为数组值之一(某些值可能相同)。我需要帮助将这些合并为其中paypal_email键相同的数组。这是我拥有的数组的print_r

Array
(
    [0] => Array
        (
            [name] => Test Product
            [product_id] => 307
            [variation_id] => 0
            [subtotal] => 30
            [total] => 30
            [quantity] => 2
            [subtotal_tax] => 2.66
            [total_tax] => 2.66
            [paypal_email] => thisismytestpaypal@sandbox.com
            [vendor_id] => 2
            [shipping] => Array
                (
                    [shipping_total] => 25.00
                    [shipping_tax] => 2.22
                )

        )

    [1] => Array
        (
            [name] => Album
            [product_id] => 354
            [variation_id] => 0
            [subtotal] => 15
            [total] => 15
            [quantity] => 1
            [subtotal_tax] => 1.33
            [total_tax] => 1.33
            [paypal_email] => thisismytestpaypal@sandbox.com
            [vendor_id] => 11
            [shipping] => Array
                (
                    [shipping_total] => 25.00
                    [shipping_tax] => 2.22
                )

        )

    [2] => Array
        (
            [name] => Beanie with Logo
            [product_id] => 357
            [variation_id] => 0
            [subtotal] => 18
            [total] => 18
            [quantity] => 1
            [subtotal_tax] => 1.60
            [total_tax] => 1.60
            [paypal_email] => ab2@sandbox.com
            [vendor_id] => 10
            [shipping] => Array
                (
                    [shipping_total] => 25.00
                    [shipping_tax] => 2.22
                )

        )

    [3] => Array
        (
            [name] => Long Sleeve Tee
            [product_id] => 352
            [variation_id] => 0
            [subtotal] => 75
            [total] => 75
            [quantity] => 3
            [subtotal_tax] => 6.66
            [total_tax] => 6.66
            [paypal_email] => ab2@sandbox.com
            [vendor_id] => 2
            [shipping] => Array
                (
                    [shipping_total] => 25.00
                    [shipping_tax] => 2.22
                )

        )

    [4] => Array
        (
            [name] => Polo
            [product_id] => 353
            [variation_id] => 0
            [subtotal] => 80
            [total] => 80
            [quantity] => 4
            [subtotal_tax] => 7.10
            [total_tax] => 7.10
            [paypal_email] => tv3@sandbox.com
            [vendor_id] => 8
            [shipping] => Array
                (
                    [shipping_total] => 25.00
                    [shipping_tax] => 2.22
                )

        )

    [5] => Array
        (
            [name] => Product From Test Vendor 3
            [product_id] => 145
            [variation_id] => 0
            [subtotal] => 60
            [total] => 60
            [quantity] => 3
            [subtotal_tax] => 5.33
            [total_tax] => 5.33
            [paypal_email] => tv3@sandbox.com
            [vendor_id] => 10
            [shipping] => Array
                (
                    [shipping_total] => 25.00
                    [shipping_tax] => 2.22
                )

        )

    [6] => Array
        (
            [name] => Product From Vendor 1
            [product_id] => 143
            [variation_id] => 0
            [subtotal] => 20
            [total] => 20
            [quantity] => 2
            [subtotal_tax] => 1.78
            [total_tax] => 1.78
            [paypal_email] => tv1@sandbox.com
            [vendor_id] => 8
            [shipping] => Array
                (
                    [shipping_total] => 25.00
                    [shipping_tax] => 2.22
                )

        )

)  

我需要将数组合并为多维数组,并以贝宝电子邮件作为键,将其他数据作为值。例如,

Array
(   [thisismytestpaypal@sandbox.com] => Array
        (
        [0] => Array
            (
                [name] => Test Product
                [product_id] => 307
                [variation_id] => 0
                [subtotal] => 30
                [total] => 30
                [quantity] => 2
                [subtotal_tax] => 2.66
                [total_tax] => 2.66
                [paypal_email] => thisismytestpaypal@sandbox.com
                [vendor_id] => 2
                [shipping] => Array
                    (
                        [shipping_total] => 25.00
                        [shipping_tax] => 2.22
                    )

            )

        [1] => Array
            (
                [name] => Album
                [product_id] => 354
                [variation_id] => 0
                [subtotal] => 15
                [total] => 15
                [quantity] => 1
                [subtotal_tax] => 1.33
                [total_tax] => 1.33
                [paypal_email] => thisismytestpaypal@sandbox.com
                [vendor_id] => 11
                [shipping] => Array
                    (
                        [shipping_total] => 25.00
                        [shipping_tax] => 2.22
                    )

            )
        )

    [ab2@sandbox.com] => Array
        (
        [0] => Array
            (
                [name] => Beanie with Logo
                [product_id] => 357
                [variation_id] => 0
                [subtotal] => 18
                [total] => 18
                [quantity] => 1
                [subtotal_tax] => 1.60
                [total_tax] => 1.60
                [paypal_email] => ab2@sandbox.com
                [vendor_id] => 10
                [shipping] => Array
                    (
                        [shipping_total] => 25.00
                        [shipping_tax] => 2.22
                    )

            )

        [1] => Array
            (
                [name] => Long Sleeve Tee
                [product_id] => 352
                [variation_id] => 0
                [subtotal] => 75
                [total] => 75
                [quantity] => 3
                [subtotal_tax] => 6.66
                [total_tax] => 6.66
                [paypal_email] => ab2@sandbox.com
                [vendor_id] => 2
                [shipping] => Array
                    (
                        [shipping_total] => 25.00
                        [shipping_tax] => 2.22
                    )

            )
        )

    [tv3@sandbox.com] => Array
        (
        [0] => Array
            (
                [name] => Polo
                [product_id] => 353
                [variation_id] => 0
                [subtotal] => 80
                [total] => 80
                [quantity] => 4
                [subtotal_tax] => 7.10
                [total_tax] => 7.10
                [paypal_email] => tv3@sandbox.com
                [vendor_id] => 8
                [shipping] => Array
                    (
                        [shipping_total] => 25.00
                        [shipping_tax] => 2.22
                    )

            )

        [1] => Array
            (
                [name] => Product From Test Vendor 3
                [product_id] => 145
                [variation_id] => 0
                [subtotal] => 60
                [total] => 60
                [quantity] => 3
                [subtotal_tax] => 5.33
                [total_tax] => 5.33
                [paypal_email] => tv3@sandbox.com
                [vendor_id] => 10
                [shipping] => Array
                    (
                        [shipping_total] => 25.00
                        [shipping_tax] => 2.22
                    )

            )
        )
    [tv1@sandbox.com] => Array
        (
        [0] => Array
            (
                [name] => Product From Vendor 1
                [product_id] => 143
                [variation_id] => 0
                [subtotal] => 20
                [total] => 20
                [quantity] => 2
                [subtotal_tax] => 1.78
                [total_tax] => 1.78
                [paypal_email] => tv1@sandbox.com
                [vendor_id] => 8
                [shipping] => Array
                    (
                        [shipping_total] => 25.00
                        [shipping_tax] => 2.22
                    )

            )
        )

)

我该怎么做?
谢谢

4 个答案:

答案 0 :(得分:3)

$orders = [.....]; //your array
$mappedOrders = [];
foreach($orders as $order) {
    $mail = $order['paypal_email'];
    if(!isset($mappedOrders[$mail])) { $mappedOrders[$mail] = []; }  //create new array in map if $mail index not exists
    $mappedOrders[$mail][] = $order;  // push order into array for mapped array
}

var_dump($mappedOrders);

答案 1 :(得分:3)

进行数组键检查循环

$result = [];

foreach ($array as $value) {
    $email = $value['paypal_email'];          // Get email

    if (!array_key_exists($email, $result)) { // Check if already on the result array
        $result[$email] = [];                 // Create new array with email as key if not
    }

    $result[$email][] = $value;               // push value to email key
}

print_r($result);

答案 2 :(得分:1)

考虑由变量$array保留的第一个数组。然后使用简单的foreach循环对其进行迭代,并将数据作为键传送到新数组$newArray,并在paypal_email节点中使用键作为值。代码应为:

$newArray = [];

foreach ($array as $value) {
    $newArray[$value['paypal_email']][] = $value;
}
print_r($newArray);

答案 3 :(得分:1)

<?php

$data = 
[
    [
        'name' => 'John',
        'email' => 'thebeatles@example.com'
    ],
    [
        'name' => 'Ringo',
        'email' => 'thebeatles@example.com'
    ],
    [
        'name' => 'Mick',
        'email' => 'thestones@example.com'
    ],
    [
        'name' => 'Keith',
        'email' => 'thestones@example.com'
    ],
];
$grouped_by_email = [];
foreach($data as $item)
    $grouped_by_email[$item['email']][] = $item;

var_export($grouped_by_email);

输出:

array (
    'thebeatles@example.com' => 
    array (
    0 => 
    array (
        'name' => 'John',
        'email' => 'thebeatles@example.com',
    ),
    1 => 
    array (
        'name' => 'Ringo',
        'email' => 'thebeatles@example.com',
    ),
    ),
    'thestones@example.com' => 
    array (
    0 => 
    array (
        'name' => 'Mick',
        'email' => 'thestones@example.com',
    ),
    1 => 
    array (
        'name' => 'Keith',
        'email' => 'thestones@example.com',
    ),
    ),
)