Reputation: 89
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
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]);
}
Upvotes: 1
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
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
)
)
)
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
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