0

I have seen tons of questions that discuss portions of my question, but have been unable to work them into a solution. Hopefully someone can help me out.

I have two arrays, I'll call them Quantity and Shipping.


Here is Quantity:

Array(
    [0] => Array(
            [0] => 1
            [1] => Fed-Ex
        )
    [1] => Array(
            [0] => 2
            [1] => USPS
        )
    [2] => Array(
            [0] => 1
            [1] => USPS-E
        )
)

[0] is the quantity, and [1] is the name.


And here is Shipping:

Array(
    [0] => Array(
            [0] => 3
            [1] => Fed-Ex
        )
    [1] => Array(
            [0] => 1
            [1] => USPS
        )
    [2] => Array(
            [0] => 11
            [1] => USPS-A
        )
    [3] => Array(
            [0] => 10
            [1] => USPS-E
        )
)

[0] is the index, and [1] is the name.


I would like to combine them based on index 1 matches into something that looks like this. If there is no match I would like a 0 to be inserted instead (like in my USPS-A example).

I'll call it Master:

Array(
    [0] => Array(
            [0] => 3
            [1] => Fed-Ex
            [2] => 1
        )
    [1] => Array(
            [0] => 1
            [1] => USPS
            [2] => 2
        )
    [2] => Array(
            [0] => 11
            [1] => USPS-A
            [2] => 0
        )
    [3] => Array(
            [0] => 10
            [1] => USPS-E
            [2] => 1
        )
)

[0] is the index, [1] is the name, and [2] is the quantity.


Does anyone have any suggestions? I tried using nested foreach loops but I was ending up with duplicates even when I used break statements. Tried array_column and in_array as well but to no success.

Any help would be appreciated. Thank you.

0

3 Answers 3

1

If you assume that the shipping array will always be bigger than the quantity, here is something that works.

$quantities = [
    [1, 'Fex-Ex'],
    [2, 'USPS'],
    [1, 'USPS-E']
];

$shippings = [
    [3, 'Fex-Ex'],
    [1, 'USPS'],
    [11, 'USPS-A'],
    [10, 'USPS-E'],
];

$master = array();
foreach ($shippings as $shipping) {
    $qty = 0;
    foreach ($quantities as $quantity) {
        if ($shipping[1] == $quantity[1]) {
            $qty = $quantity[0];
        }
    }
    $master[] = array(
        $shipping[0],
        $shipping[1],
        $qty
    );
}

var_dump($master);
Sign up to request clarification or add additional context in comments.

1 Comment

Thank you - this does exactly what I was looking for.
1

You don't need nested loops to do this. You can just loop over each of the arrays once.

First, iterate the $shipping array to build the $master array using the [1] key (name) as its index. You can add a zero value for quantity at index 2 at the same time.

foreach ($shipping as $s) {
    $master[$s[1]] = $s + [2 => 0];
}

Second, iterate the $quantity array to update the quantity values in $master.

foreach ($quantity as $q) {
    $master[$q[1]][2] = $q[0];
}

Keep in mind that with this approach, using the names as keys, if there are duplicate names they will be overwritten.

1 Comment

Very ingenious. Thanks for the answer.
0

I think that would do the job (without nested loops):

<?php 

$quantities = [
    [1, 'Fed-Ex'],
    [2, 'USPS'],
    [1, 'USPS-E']
];

$shippings = [
    [3, 'Fed-Ex'],
    [1, 'USPS'],
    [11, 'USPS-A'],
    [10, 'USPS-E'],
];

foreach($quantities as &$v) {
    $quantities[$v[1]] = $v[0];
    unset($v);
}

$master = [];

foreach($shippings as $v) {
    $master[] = [
        $v[0], 
        $v[1], 
        isset($quantities[$v[1]]) ? $quantities[$v[1]] : 0
    ];
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.