Alex Welander
Alex Welander

Reputation: 89

PHP replace value in array with value from different array

I have two arrays, array1 with 408 rows and an array2 with 256 rows.

here is an saml example of array1

Array
(
    [0] => Array
        (
            [nodo] => N_127y4Gral
            [int_id] => 34213897
            [dow_id] => Array
                (
                    [0] => 536870914
                    [1] => 536870914
                    [2] => 536870914
                    [3] => 536870914
                    [4] => 536870914
                )
        )
    [1] => Array
        (
            [nodo] => N_121y7
            [int_id] => 34213905
            [dow_id] => Array
                (
                    [0] => 536870915
                    [1] => 536870915
                    [2] => 536870915
                    [3] => 536870915
                    [4] => 536870915
                )
        )
    [2] => Array
        (
            [nodo] => N_144y4Gral
            [int_id] => 34213921
            [dow_id] => Array
                (
                    [0] => 536870918
                    [1] => 536870918
                    [2] => 536870918
                    [3] => 536870918
                    [4] => 536870918
                )
        )
    [3] => Array
        (
            [nodo] => N_132y2
            [int_id] => 34213921
            [dow_id] => Array
                (
                    [0] => 536870914
                    [1] => 536870914
                    [2] => 536870914
                    [3] => 536870914
                    [4] => 536870914
                )
        )
)

and here is an saml example of array2

Array
(
    [0] => Array([536870914] => 201920520)
    [1] => Array([536870914] => 201920528)
    [2] => Array([536870914] => 201920536)
    [3] => Array([536870914] => 201920544)
    [4] => Array([536870914] => 201920552)
    [5] => Array([536870915] => 201920560)
    [6] => Array([536870915] => 201920568)
    [7] => Array([536870915] => 201920576)
    [8] => Array([536870915] => 201920584)
    [9] => Array([536870915] => 201920592)
    [10] => Array([536870916] => 201928784)
    [11] => Array([536870916] => 201928792)
    [12] => Array([536870916] => 201928800)
    [13] => Array([536870916] => 201928808)
    [14] => Array([536870916] => 201928816)
    [15] => Array([536870917] => 201928824)
    [16] => Array([536870917] => 201928832)
    [17] => Array([536870917] => 201932808)
    [18] => Array([536870917] => 201932816)
    [19] => Array([536870917] => 201932824)
    [20] => Array([536870918] => 201920600)
    [21] => Array([536870918] => 201920608)
    [22] => Array([536870918] => 201920616)
    [23] => Array([536870918] => 201920624)
    [24] => Array([536870918] => 201920632)
)

what I am trying to figure out is how can i replace the dow_id values in array1 with the corresponding values from array2. All the dow_id values exist as ids in array2.

this is the output I am trying to achieve

Array
(
    [0] => Array
        (
            [nodo] => N_127y4Gral
            [int_id] => 34213897
            [dow_id] => Array
                (
                    [0] => 201920520
                    [1] => 201920528
                    [2] => 201920536
                    [3] => 201920544
                    [4] => 201920552
                )
        )
    [1] => Array
        (
            [nodo] => N_121y7
            [int_id] => 34213905
            [dow_id] => Array
                (
                    [0] => 201920560
                    [1] => 201920568
                    [2] => 201920576
                    [3] => 201920584
                    [4] => 201920592
                )
        )
    [2] => Array
        (
            [nodo] => N_144y4Gral
            [int_id] => 34213921
            [dow_id] => Array
                (
                    [0] => 201920600
                    [1] => 201920608
                    [2] => 201920616
                    [3] => 201920624
                    [4] => 201920632
                )
        )
    [3] => Array
        (
            [nodo] => N_132y2
            [int_id] => 34213854
            [dow_id] => Array
                (
                    [0] => 201920520
                    [1] => 201920528
                    [2] => 201920536
                    [3] => 201920544
                    [4] => 201920552
                )
        )            
)

Any help or suggestions are greatly appreciated

Upvotes: 0

Views: 86

Answers (4)

Nick
Nick

Reputation: 147146

This is really easily done with array_column. No need to change array formats:

foreach ($a1 as &$value) {
    $value['dow_id'] = array_column($a2, $value['dow_id'][0]);
}

Demo on 3v4l.org

Upvotes: 1

echmel
echmel

Reputation: 154

$arr = [
    [

        'nodo'   => 'N_127y4Gral',
        'int_id' => 34213897,
        'dow_id' => [
            0 => 536870914,
            1 => 536870914,
            2 => 536870914,
            3 => 536870914,
            4 => 536870914,
        ]
    ],
    [

        'nodo'   => 'N_121y7',
        'int_id' => 34213905,
        'dow_id' => [
            0 => 536870915,
            1 => 536870915,
            2 => 536870915,
            3 => 536870915,
            4 => 536870915,
        ]
    ],
    [

        'nodo'   => 'N_144y4Gral',
        'int_id' => 34213921,
        'dow_id' => [
            0 => 536870918,
            1 => 536870918,
            2 => 536870918,
            3 => 536870918,
            4 => 536870918,
        ]
    ],
];

$childArray = [
    0  => [536870914 => 201920520],
    1  => [536870914 => 201920528],
    2  => [536870914 => 201920536],
    3  => [536870914 => 201920544],
    4  => [536870914 => 201920552],
    5  => [536870915 => 201920560],
    6  => [536870915 => 201920568],
    7  => [536870915 => 201920576],
    8  => [536870915 => 201920584],
    9  => [536870915 => 201920592],
    20 => [536870918 => 201920600],
    21 => [536870918 => 201920608],
    22 => [536870918 => 201920616],
    23 => [536870918 => 201920624],
    24 => [536870918 => 201920632],
];

/**
 * grouping
 * @param array $last
 * @return array
 */
function groupArray(array $last)
{
    $result = [];
    foreach ($last as $value) {
        $result[key($value)][] = current($value);
    }
    return $result;
}

/**
 * @param array $first
 * @param array $last
 * @return array
 */
function linkArray(array $first, array $last)
{
    $result = [];
    foreach ($first as $id => $fValue) {
        if (empty($fValue['dow_id'])) {
            continue;
        }
        $dow = [];
        foreach ($fValue['dow_id'] as $dowId => $dowValue) {
            $dow[$dowId] = array_shift($last[$dowValue]);
        }
        $result[$id] = [
            'nodo'   => $fValue['nodo'] ?? '',
            'int_id' => $fValue['int_id'] ?? 0,
            'dow_id' => $dow
        ];
    }
    return $result;
}

$result = linkArray($arr, groupArray($childArray));
print_r($result);

So we have:

Array
(
    [0] => Array
        (
            [nodo] => N_127y4Gral
            [int_id] => 34213897
            [dow_id] => Array
                (
                    [0] => 201920520
                    [1] => 201920528
                    [2] => 201920536
                    [3] => 201920544
                    [4] => 201920552
                )

        )

    [1] => Array
        (
            [nodo] => N_121y7
            [int_id] => 34213905
            [dow_id] => Array
                (
                    [0] => 201920560
                    [1] => 201920568
                    [2] => 201920576
                    [3] => 201920584
                    [4] => 201920592
                )

        )

    [2] => Array
        (
            [nodo] => N_144y4Gral
            [int_id] => 34213921
            [dow_id] => Array
                (
                    [0] => 201920600
                    [1] => 201920608
                    [2] => 201920616
                    [3] => 201920624
                    [4] => 201920632
                )

        )

)

So even you have missed elements, you will receive null elements in the result array. In both arrays you have duplicates. You should optimize their structure.

Upvotes: 0

ArtisticPhoenix
ArtisticPhoenix

Reputation: 21661

Something like this:

$a1 = array (
    0 => 
    array (
        'nodo' => 'N_127y4Gral',
        'int_id' => 34213897,
        'dow_id' => 
        array (
            0 => 536870914,
            1 => 536870914,
            2 => 536870914,
            3 => 536870914,
            4 => 536870914
        ),

    ),
    1 => 
    array (
        'nodo' => 'N_121y7',
        'int_id' => 34213905,
        'dow_id' => 
        array (
            0 => 536870915,
            1 => 536870915,
            2 => 536870915,
            3 => 536870915,
            4 => 536870915
        ),

    ),
    2 => 
    array (
        'nodo' => 'N_144y4Gral',
        'int_id' => 34213921,
        'dow_id' => 
        array (
            0 => 536870918,
            1 => 536870918,
            2 => 536870918,
            3 => 536870918,
            4 => 536870918
        ),

    ),
    3 => 
    array (
        'nodo' => 'N_132y2',
        'int_id' => 34213921,
        'dow_id' => 
        array (
            0 => 536870914,
            1 => 536870914,
            2 => 536870914,
            3 => 536870914,
            4 => 536870914
        ),

    )
);

$a2 = array (
    0 => 
    array (
        536870914 => 201920520
    ),
    1 => 
    array (
        536870914 => 201920528
    ),
    2 => 
    array (
        536870914 => 201920536
    ),
    3 => 
    array (
        536870914 => 201920544
    ),
    4 => 
    array (
        536870914 => 201920552
    ),
    5 => 
    array (
        536870915 => 201920560
    ),
    6 => 
    array (
        536870915 => 201920568
    ),
    7 => 
    array (
        536870915 => 201920576
    ),
    8 => 
    array (
        536870915 => 201920584
    ),
    9 => 
    array (
        536870915 => 201920592
    ),
    10 => 
    array (
        536870916 => 201928784
    ),
    11 => 
    array (
        536870916 => 201928792
    ),
    12 => 
    array (
        536870916 => 201928800
    ),
    13 => 
    array (
        536870916 => 201928808
    ),
    14 => 
    array (
        536870916 => 201928816
    ),
    15 => 
    array (
        536870917 => 201928824
    ),
    16 => 
    array (
        536870917 => 201928832
    ),
    17 => 
    array (
        536870917 => 201932808
    ),
    18 => 
    array (
        536870917 => 201932816
    ),
    19 => 
    array (
        536870917 => 201932824
    ),
    20 => 
    array (
        536870918 => 201920600
    ),
    21 => 
    array (
        536870918 => 201920608
    ),
    22 => 
    array (
        536870918 => 201920616
    ),
    23 => 
    array (
        536870918 => 201920624
    ),
    24 => 
    array (
        536870918 => 201920632
    )
);

And the code (separate for readability)

$o = [];

#convert the structure of the second array
foreach($a2 as $k=>$v){
    #eg. $v = [536870914 => 201920520]
    $key = key($v); #get the first key 
    $o[$key][] = reset($v); #get the first value 
}

#code to replace (simple right), I am assuming that dow_id contains only 1 id (in duplicate)
foreach( $a1 as $k=>&$v){
    if(isset($o[$v['dow_id'][0]]))  $v['dow_id'] = $o[$v['dow_id'][0]];
}

print_r($a1);

Output

Array
(
    [0] => Array
        (
            [nodo] => N_127y4Gral
            [int_id] => 34213897
            [dow_id] => Array
                (
                    [0] => 201920520
                    [1] => 201920528
                    [2] => 201920536
                    [3] => 201920544
                    [4] => 201920552
                )

        )

    [1] => Array
        (
            [nodo] => N_121y7
            [int_id] => 34213905
            [dow_id] => Array
                (
                    [0] => 201920560
                    [1] => 201920568
                    [2] => 201920576
                    [3] => 201920584
                    [4] => 201920592
                )

        )

    [2] => Array
        (
            [nodo] => N_144y4Gral
            [int_id] => 34213921
            [dow_id] => Array
                (
                    [0] => 201920600
                    [1] => 201920608
                    [2] => 201920616
                    [3] => 201920624
                    [4] => 201920632
                )

        )

    [3] => Array
        (
            [nodo] => N_132y2
            [int_id] => 34213921
            [dow_id] => Array
                (
                    [0] => 201920520
                    [1] => 201920528
                    [2] => 201920536
                    [3] => 201920544
                    [4] => 201920552
                )

        )

)

Sandbox

PS. I converted your print_r output to var_export, var export is valid PHP syntax. Print R is not. You can find the converter on my website. I built it, it works great as long as the output hasn't been modified. Sorry if my website is a bit "janky" I never have motivation to work on it... lol.

Upvotes: 0

AbraCadaver
AbraCadaver

Reputation: 78994

If you change $array2 to this structure:

$array2 = Array(536870914 => Array(201920520, 201920528, 201920536, 201920544, 201920552));

Then loop and replace with the array indexed by the current value:

foreach($array1 as &$values) {
    $values['dow_id'] = $array2[reset($values['dow_id')];   
}

If you change $array2 to this structure:

$array2 = Array(201920520 => 536870914, 
                201920528 => 536870914, 
                201920536 => 536870914, 
                201920544 => 536870914, 
                536870914 => 536870914);

Then loop and extract the indexes where the value equals the current value:

foreach($array1 as &$values) {
    $values['dow_id'] = array_keys($values['dow_id'], reset($values['dow_id']));
}

Upvotes: 1

Related Questions