Array merge to multidimensional by key
Iam having trouble with solving merging of array to multidimensional array.
My array looks like:
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_Sinoskysun International (HK) CO., LTD
)
[1] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_RUTRONIK Elektronische Ba
)
[2] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TTI
)
[3] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_ARROW CENTRAL EUROPE GMBH
)
[4] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
[5] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_YANGZHIDING ELECTRONICS
)
[6] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] =>
)
[7] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
)
And i need to merge them like:
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
"Pro_Sinoskysun International (HK) CO., LTD",
"Pro_RUTRONIK Elektronische Ba",
"Pro_TTI",
"Pro_ARROW CENTRAL EUROPE GMBH",
"Pro_TDK",
"Pro_YANGZHIDING ELECTRONICS"
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] =>
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
)
Input array can be 5 or 500 items and i need to merge them by ID.. There is just one thing different from each other and its who made them. Is it somehow possible?
If something more is needed i can add it. :)
Thanks a lot for helping.
php arrays multidimensional-array
add a comment |
Iam having trouble with solving merging of array to multidimensional array.
My array looks like:
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_Sinoskysun International (HK) CO., LTD
)
[1] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_RUTRONIK Elektronische Ba
)
[2] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TTI
)
[3] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_ARROW CENTRAL EUROPE GMBH
)
[4] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
[5] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_YANGZHIDING ELECTRONICS
)
[6] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] =>
)
[7] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
)
And i need to merge them like:
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
"Pro_Sinoskysun International (HK) CO., LTD",
"Pro_RUTRONIK Elektronische Ba",
"Pro_TTI",
"Pro_ARROW CENTRAL EUROPE GMBH",
"Pro_TDK",
"Pro_YANGZHIDING ELECTRONICS"
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] =>
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
)
Input array can be 5 or 500 items and i need to merge them by ID.. There is just one thing different from each other and its who made them. Is it somehow possible?
If something more is needed i can add it. :)
Thanks a lot for helping.
php arrays multidimensional-array
Have you tried anything so far?
– Nigel Ren
Nov 16 '18 at 7:14
I will say that it can be done, and it would not even be that hard. You will have to iterate over the firts array and add element to their respective places in second array during the iteration of the first
– Eugene Anisiutkin
Nov 16 '18 at 7:20
@NigelRen yep i've.. also i've tried to looking on stack for answers too but nothing from it was working as i wanted.. :( Iam learning by myself so its lil harder for me to solve things by myself.. I tried it for few hrs but with no result
– Daniel Sympho Weiss
Nov 16 '18 at 7:22
add a comment |
Iam having trouble with solving merging of array to multidimensional array.
My array looks like:
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_Sinoskysun International (HK) CO., LTD
)
[1] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_RUTRONIK Elektronische Ba
)
[2] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TTI
)
[3] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_ARROW CENTRAL EUROPE GMBH
)
[4] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
[5] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_YANGZHIDING ELECTRONICS
)
[6] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] =>
)
[7] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
)
And i need to merge them like:
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
"Pro_Sinoskysun International (HK) CO., LTD",
"Pro_RUTRONIK Elektronische Ba",
"Pro_TTI",
"Pro_ARROW CENTRAL EUROPE GMBH",
"Pro_TDK",
"Pro_YANGZHIDING ELECTRONICS"
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] =>
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
)
Input array can be 5 or 500 items and i need to merge them by ID.. There is just one thing different from each other and its who made them. Is it somehow possible?
If something more is needed i can add it. :)
Thanks a lot for helping.
php arrays multidimensional-array
Iam having trouble with solving merging of array to multidimensional array.
My array looks like:
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_Sinoskysun International (HK) CO., LTD
)
[1] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_RUTRONIK Elektronische Ba
)
[2] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TTI
)
[3] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_ARROW CENTRAL EUROPE GMBH
)
[4] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
[5] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_YANGZHIDING ELECTRONICS
)
[6] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] =>
)
[7] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
)
And i need to merge them like:
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
"Pro_Sinoskysun International (HK) CO., LTD",
"Pro_RUTRONIK Elektronische Ba",
"Pro_TTI",
"Pro_ARROW CENTRAL EUROPE GMBH",
"Pro_TDK",
"Pro_YANGZHIDING ELECTRONICS"
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] =>
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
)
Input array can be 5 or 500 items and i need to merge them by ID.. There is just one thing different from each other and its who made them. Is it somehow possible?
If something more is needed i can add it. :)
Thanks a lot for helping.
php arrays multidimensional-array
php arrays multidimensional-array
edited Nov 16 '18 at 7:37
Daniel Sympho Weiss
asked Nov 16 '18 at 7:08
Daniel Sympho WeissDaniel Sympho Weiss
64
64
Have you tried anything so far?
– Nigel Ren
Nov 16 '18 at 7:14
I will say that it can be done, and it would not even be that hard. You will have to iterate over the firts array and add element to their respective places in second array during the iteration of the first
– Eugene Anisiutkin
Nov 16 '18 at 7:20
@NigelRen yep i've.. also i've tried to looking on stack for answers too but nothing from it was working as i wanted.. :( Iam learning by myself so its lil harder for me to solve things by myself.. I tried it for few hrs but with no result
– Daniel Sympho Weiss
Nov 16 '18 at 7:22
add a comment |
Have you tried anything so far?
– Nigel Ren
Nov 16 '18 at 7:14
I will say that it can be done, and it would not even be that hard. You will have to iterate over the firts array and add element to their respective places in second array during the iteration of the first
– Eugene Anisiutkin
Nov 16 '18 at 7:20
@NigelRen yep i've.. also i've tried to looking on stack for answers too but nothing from it was working as i wanted.. :( Iam learning by myself so its lil harder for me to solve things by myself.. I tried it for few hrs but with no result
– Daniel Sympho Weiss
Nov 16 '18 at 7:22
Have you tried anything so far?
– Nigel Ren
Nov 16 '18 at 7:14
Have you tried anything so far?
– Nigel Ren
Nov 16 '18 at 7:14
I will say that it can be done, and it would not even be that hard. You will have to iterate over the firts array and add element to their respective places in second array during the iteration of the first
– Eugene Anisiutkin
Nov 16 '18 at 7:20
I will say that it can be done, and it would not even be that hard. You will have to iterate over the firts array and add element to their respective places in second array during the iteration of the first
– Eugene Anisiutkin
Nov 16 '18 at 7:20
@NigelRen yep i've.. also i've tried to looking on stack for answers too but nothing from it was working as i wanted.. :( Iam learning by myself so its lil harder for me to solve things by myself.. I tried it for few hrs but with no result
– Daniel Sympho Weiss
Nov 16 '18 at 7:22
@NigelRen yep i've.. also i've tried to looking on stack for answers too but nothing from it was working as i wanted.. :( Iam learning by myself so its lil harder for me to solve things by myself.. I tried it for few hrs but with no result
– Daniel Sympho Weiss
Nov 16 '18 at 7:22
add a comment |
3 Answers
3
active
oldest
votes
This code will produce your desired output, regardless of whether the array has different id values. This code does assume that all similar products are grouped in order though:
$output = array();
$i = -1;
foreach ($array as $arr) {
if ($i < 0 || $output[$i]['id'] != $arr['id'] || $output[$i]['regNumber'] != $arr['regNumber'] || $output[$i]['name'] != $arr['name']) {
// new product
$output[++$i] = $arr;
$output[$i]['madeBy2'] = array($arr['madeBy2']);
}
else {
// same product, new manufacturer
$output[$i]['madeBy2'] = $arr['madeBy2'];
}
}
print_r($output);
Demo on 3v4l.org
Alternate version Only makes madeBy2
element into an array if there are multiple values:
$output = array();
$i = -1;
foreach ($array as $arr) {
if ($i < 0 || $output[$i]['id'] != $arr['id'] || $output[$i]['regNumber'] != $arr['regNumber'] || $output[$i]['name'] != $arr['name']) {
// new product
$output[++$i] = $arr;
}
else {
// same product, new manufacturer
if (!is_array($output[$i]['madeBy2']))
$output[$i]['madeBy2'] = array($output[$i]['madeBy2'], $arr['madeBy2']);
else
$output[$i]['madeBy2'] = $arr['madeBy2'];
}
}
print_r($output);
Output (for your sample data)
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
"Pro_Sinoskysun International (HK) CO., LTD",
"Pro_RUTRONIK Elektronische Ba",
"Pro_TTI",
"Pro_ARROW CENTRAL EUROPE GMBH",
"Pro_TDK",
"Pro_YANGZHIDING ELECTRONICS"
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] =>
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
)
Demo on 3v4l.org
That's it.. Output is not what you wrote but i can work with it.. :) Thanks a lot for help. Output pastebin.com/NB1bCGD2
– Daniel Sympho Weiss
Nov 16 '18 at 7:50
@DanielSymphoWeiss You're right... pasting output from 3v4l is a pain so I copied yours. :-P but I've added an alternate solution which will only convertmadeBy2
into an array if there are multiple values so it does give you that output.
– Nick
Nov 16 '18 at 7:55
one more question.. If i want to add description to row in array madeBy2 how can i do it?
– Daniel Sympho Weiss
Nov 19 '18 at 8:03
@DanielSymphoWeiss I can't see where description is coming from? It might be better if you asked a new question using this answer as a starting point and adding the additional information. On the upside you can gain additional rep by accepting another answer!
– Nick
Nov 19 '18 at 8:09
ah okay :) i wont spam so better to ask here :D gimme sec
– Daniel Sympho Weiss
Nov 19 '18 at 8:11
|
show 4 more comments
I build up an array which is indexed by the id
value from the data, if it's not already set then I create a new element with the data - although madeBy2
is created as an array. If the element already exists, then it adds the new value to the existing list of values ( using )...
$out = ;
foreach ( $inp as $data ) {
if ( isset ($out[$data['id']])) {
$out[$data['id']]["madeBy2"] = $data["madeBy2"];
}
else {
$out[$data['id']] = [ "id"=>$data['id'],
"regNumber" => $data['regNumber'],
"name" => $data['name'],
"madeBy2" => [$data['madeBy2']]];
}
}
print_r(array_values($out));
This will leave an array indexed by the id
so I use array_values()
in the print_r()
, you can leave it in if you need it.
add a comment |
Comments in code
foreach ($array as $arr) {
if(!isset($output[$arr["id"]])){ // if item does not exist
$output[$arr["id"]] = $arr; // create array
$output[$arr["id"]]['madeBy2'] = [$output[$arr["id"]]['madeBy2']]; // change type on madeBy2 to array
}else{
$output[$arr["id"]]['madeBy2'] = $arr['madeBy2']; // it item exist add madeBy2 to the list
}
}
$output = array_values($output); // remove associative array keys.
print_r($output);
This method does not rely on the list being sorted and only madeBy2 is hardcode.
Meaning if one array has an extra item this method will keep it opposed to Nigel's.
Output:
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100nSMD060310%X7R25V
[madeBy2] => Array
(
[0] => Pro_SinoskysunInternational(HK) CO.,LTD
[1] => Pro_RUTRONIKElektronischeBa
[2] => Pro_TTI
[3] => Pro_ARROWCENTRALEUROPEGMBH
[4] => Pro_TDK
[5] => Pro_YANGZHIDINGELECTRONICS
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] => Array
(
[0] =>
)
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
[0] => Pro_TDK
)
)
)
https://3v4l.org/iCjk1
Demo with extra item:
https://3v4l.org/0jmpL
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53333032%2farray-merge-to-multidimensional-by-key%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
This code will produce your desired output, regardless of whether the array has different id values. This code does assume that all similar products are grouped in order though:
$output = array();
$i = -1;
foreach ($array as $arr) {
if ($i < 0 || $output[$i]['id'] != $arr['id'] || $output[$i]['regNumber'] != $arr['regNumber'] || $output[$i]['name'] != $arr['name']) {
// new product
$output[++$i] = $arr;
$output[$i]['madeBy2'] = array($arr['madeBy2']);
}
else {
// same product, new manufacturer
$output[$i]['madeBy2'] = $arr['madeBy2'];
}
}
print_r($output);
Demo on 3v4l.org
Alternate version Only makes madeBy2
element into an array if there are multiple values:
$output = array();
$i = -1;
foreach ($array as $arr) {
if ($i < 0 || $output[$i]['id'] != $arr['id'] || $output[$i]['regNumber'] != $arr['regNumber'] || $output[$i]['name'] != $arr['name']) {
// new product
$output[++$i] = $arr;
}
else {
// same product, new manufacturer
if (!is_array($output[$i]['madeBy2']))
$output[$i]['madeBy2'] = array($output[$i]['madeBy2'], $arr['madeBy2']);
else
$output[$i]['madeBy2'] = $arr['madeBy2'];
}
}
print_r($output);
Output (for your sample data)
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
"Pro_Sinoskysun International (HK) CO., LTD",
"Pro_RUTRONIK Elektronische Ba",
"Pro_TTI",
"Pro_ARROW CENTRAL EUROPE GMBH",
"Pro_TDK",
"Pro_YANGZHIDING ELECTRONICS"
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] =>
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
)
Demo on 3v4l.org
That's it.. Output is not what you wrote but i can work with it.. :) Thanks a lot for help. Output pastebin.com/NB1bCGD2
– Daniel Sympho Weiss
Nov 16 '18 at 7:50
@DanielSymphoWeiss You're right... pasting output from 3v4l is a pain so I copied yours. :-P but I've added an alternate solution which will only convertmadeBy2
into an array if there are multiple values so it does give you that output.
– Nick
Nov 16 '18 at 7:55
one more question.. If i want to add description to row in array madeBy2 how can i do it?
– Daniel Sympho Weiss
Nov 19 '18 at 8:03
@DanielSymphoWeiss I can't see where description is coming from? It might be better if you asked a new question using this answer as a starting point and adding the additional information. On the upside you can gain additional rep by accepting another answer!
– Nick
Nov 19 '18 at 8:09
ah okay :) i wont spam so better to ask here :D gimme sec
– Daniel Sympho Weiss
Nov 19 '18 at 8:11
|
show 4 more comments
This code will produce your desired output, regardless of whether the array has different id values. This code does assume that all similar products are grouped in order though:
$output = array();
$i = -1;
foreach ($array as $arr) {
if ($i < 0 || $output[$i]['id'] != $arr['id'] || $output[$i]['regNumber'] != $arr['regNumber'] || $output[$i]['name'] != $arr['name']) {
// new product
$output[++$i] = $arr;
$output[$i]['madeBy2'] = array($arr['madeBy2']);
}
else {
// same product, new manufacturer
$output[$i]['madeBy2'] = $arr['madeBy2'];
}
}
print_r($output);
Demo on 3v4l.org
Alternate version Only makes madeBy2
element into an array if there are multiple values:
$output = array();
$i = -1;
foreach ($array as $arr) {
if ($i < 0 || $output[$i]['id'] != $arr['id'] || $output[$i]['regNumber'] != $arr['regNumber'] || $output[$i]['name'] != $arr['name']) {
// new product
$output[++$i] = $arr;
}
else {
// same product, new manufacturer
if (!is_array($output[$i]['madeBy2']))
$output[$i]['madeBy2'] = array($output[$i]['madeBy2'], $arr['madeBy2']);
else
$output[$i]['madeBy2'] = $arr['madeBy2'];
}
}
print_r($output);
Output (for your sample data)
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
"Pro_Sinoskysun International (HK) CO., LTD",
"Pro_RUTRONIK Elektronische Ba",
"Pro_TTI",
"Pro_ARROW CENTRAL EUROPE GMBH",
"Pro_TDK",
"Pro_YANGZHIDING ELECTRONICS"
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] =>
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
)
Demo on 3v4l.org
That's it.. Output is not what you wrote but i can work with it.. :) Thanks a lot for help. Output pastebin.com/NB1bCGD2
– Daniel Sympho Weiss
Nov 16 '18 at 7:50
@DanielSymphoWeiss You're right... pasting output from 3v4l is a pain so I copied yours. :-P but I've added an alternate solution which will only convertmadeBy2
into an array if there are multiple values so it does give you that output.
– Nick
Nov 16 '18 at 7:55
one more question.. If i want to add description to row in array madeBy2 how can i do it?
– Daniel Sympho Weiss
Nov 19 '18 at 8:03
@DanielSymphoWeiss I can't see where description is coming from? It might be better if you asked a new question using this answer as a starting point and adding the additional information. On the upside you can gain additional rep by accepting another answer!
– Nick
Nov 19 '18 at 8:09
ah okay :) i wont spam so better to ask here :D gimme sec
– Daniel Sympho Weiss
Nov 19 '18 at 8:11
|
show 4 more comments
This code will produce your desired output, regardless of whether the array has different id values. This code does assume that all similar products are grouped in order though:
$output = array();
$i = -1;
foreach ($array as $arr) {
if ($i < 0 || $output[$i]['id'] != $arr['id'] || $output[$i]['regNumber'] != $arr['regNumber'] || $output[$i]['name'] != $arr['name']) {
// new product
$output[++$i] = $arr;
$output[$i]['madeBy2'] = array($arr['madeBy2']);
}
else {
// same product, new manufacturer
$output[$i]['madeBy2'] = $arr['madeBy2'];
}
}
print_r($output);
Demo on 3v4l.org
Alternate version Only makes madeBy2
element into an array if there are multiple values:
$output = array();
$i = -1;
foreach ($array as $arr) {
if ($i < 0 || $output[$i]['id'] != $arr['id'] || $output[$i]['regNumber'] != $arr['regNumber'] || $output[$i]['name'] != $arr['name']) {
// new product
$output[++$i] = $arr;
}
else {
// same product, new manufacturer
if (!is_array($output[$i]['madeBy2']))
$output[$i]['madeBy2'] = array($output[$i]['madeBy2'], $arr['madeBy2']);
else
$output[$i]['madeBy2'] = $arr['madeBy2'];
}
}
print_r($output);
Output (for your sample data)
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
"Pro_Sinoskysun International (HK) CO., LTD",
"Pro_RUTRONIK Elektronische Ba",
"Pro_TTI",
"Pro_ARROW CENTRAL EUROPE GMBH",
"Pro_TDK",
"Pro_YANGZHIDING ELECTRONICS"
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] =>
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
)
Demo on 3v4l.org
This code will produce your desired output, regardless of whether the array has different id values. This code does assume that all similar products are grouped in order though:
$output = array();
$i = -1;
foreach ($array as $arr) {
if ($i < 0 || $output[$i]['id'] != $arr['id'] || $output[$i]['regNumber'] != $arr['regNumber'] || $output[$i]['name'] != $arr['name']) {
// new product
$output[++$i] = $arr;
$output[$i]['madeBy2'] = array($arr['madeBy2']);
}
else {
// same product, new manufacturer
$output[$i]['madeBy2'] = $arr['madeBy2'];
}
}
print_r($output);
Demo on 3v4l.org
Alternate version Only makes madeBy2
element into an array if there are multiple values:
$output = array();
$i = -1;
foreach ($array as $arr) {
if ($i < 0 || $output[$i]['id'] != $arr['id'] || $output[$i]['regNumber'] != $arr['regNumber'] || $output[$i]['name'] != $arr['name']) {
// new product
$output[++$i] = $arr;
}
else {
// same product, new manufacturer
if (!is_array($output[$i]['madeBy2']))
$output[$i]['madeBy2'] = array($output[$i]['madeBy2'], $arr['madeBy2']);
else
$output[$i]['madeBy2'] = $arr['madeBy2'];
}
}
print_r($output);
Output (for your sample data)
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
"Pro_Sinoskysun International (HK) CO., LTD",
"Pro_RUTRONIK Elektronische Ba",
"Pro_TTI",
"Pro_ARROW CENTRAL EUROPE GMBH",
"Pro_TDK",
"Pro_YANGZHIDING ELECTRONICS"
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] =>
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Pro_TDK
)
)
Demo on 3v4l.org
edited Nov 16 '18 at 7:54
answered Nov 16 '18 at 7:46
NickNick
37k132343
37k132343
That's it.. Output is not what you wrote but i can work with it.. :) Thanks a lot for help. Output pastebin.com/NB1bCGD2
– Daniel Sympho Weiss
Nov 16 '18 at 7:50
@DanielSymphoWeiss You're right... pasting output from 3v4l is a pain so I copied yours. :-P but I've added an alternate solution which will only convertmadeBy2
into an array if there are multiple values so it does give you that output.
– Nick
Nov 16 '18 at 7:55
one more question.. If i want to add description to row in array madeBy2 how can i do it?
– Daniel Sympho Weiss
Nov 19 '18 at 8:03
@DanielSymphoWeiss I can't see where description is coming from? It might be better if you asked a new question using this answer as a starting point and adding the additional information. On the upside you can gain additional rep by accepting another answer!
– Nick
Nov 19 '18 at 8:09
ah okay :) i wont spam so better to ask here :D gimme sec
– Daniel Sympho Weiss
Nov 19 '18 at 8:11
|
show 4 more comments
That's it.. Output is not what you wrote but i can work with it.. :) Thanks a lot for help. Output pastebin.com/NB1bCGD2
– Daniel Sympho Weiss
Nov 16 '18 at 7:50
@DanielSymphoWeiss You're right... pasting output from 3v4l is a pain so I copied yours. :-P but I've added an alternate solution which will only convertmadeBy2
into an array if there are multiple values so it does give you that output.
– Nick
Nov 16 '18 at 7:55
one more question.. If i want to add description to row in array madeBy2 how can i do it?
– Daniel Sympho Weiss
Nov 19 '18 at 8:03
@DanielSymphoWeiss I can't see where description is coming from? It might be better if you asked a new question using this answer as a starting point and adding the additional information. On the upside you can gain additional rep by accepting another answer!
– Nick
Nov 19 '18 at 8:09
ah okay :) i wont spam so better to ask here :D gimme sec
– Daniel Sympho Weiss
Nov 19 '18 at 8:11
That's it.. Output is not what you wrote but i can work with it.. :) Thanks a lot for help. Output pastebin.com/NB1bCGD2
– Daniel Sympho Weiss
Nov 16 '18 at 7:50
That's it.. Output is not what you wrote but i can work with it.. :) Thanks a lot for help. Output pastebin.com/NB1bCGD2
– Daniel Sympho Weiss
Nov 16 '18 at 7:50
@DanielSymphoWeiss You're right... pasting output from 3v4l is a pain so I copied yours. :-P but I've added an alternate solution which will only convert
madeBy2
into an array if there are multiple values so it does give you that output.– Nick
Nov 16 '18 at 7:55
@DanielSymphoWeiss You're right... pasting output from 3v4l is a pain so I copied yours. :-P but I've added an alternate solution which will only convert
madeBy2
into an array if there are multiple values so it does give you that output.– Nick
Nov 16 '18 at 7:55
one more question.. If i want to add description to row in array madeBy2 how can i do it?
– Daniel Sympho Weiss
Nov 19 '18 at 8:03
one more question.. If i want to add description to row in array madeBy2 how can i do it?
– Daniel Sympho Weiss
Nov 19 '18 at 8:03
@DanielSymphoWeiss I can't see where description is coming from? It might be better if you asked a new question using this answer as a starting point and adding the additional information. On the upside you can gain additional rep by accepting another answer!
– Nick
Nov 19 '18 at 8:09
@DanielSymphoWeiss I can't see where description is coming from? It might be better if you asked a new question using this answer as a starting point and adding the additional information. On the upside you can gain additional rep by accepting another answer!
– Nick
Nov 19 '18 at 8:09
ah okay :) i wont spam so better to ask here :D gimme sec
– Daniel Sympho Weiss
Nov 19 '18 at 8:11
ah okay :) i wont spam so better to ask here :D gimme sec
– Daniel Sympho Weiss
Nov 19 '18 at 8:11
|
show 4 more comments
I build up an array which is indexed by the id
value from the data, if it's not already set then I create a new element with the data - although madeBy2
is created as an array. If the element already exists, then it adds the new value to the existing list of values ( using )...
$out = ;
foreach ( $inp as $data ) {
if ( isset ($out[$data['id']])) {
$out[$data['id']]["madeBy2"] = $data["madeBy2"];
}
else {
$out[$data['id']] = [ "id"=>$data['id'],
"regNumber" => $data['regNumber'],
"name" => $data['name'],
"madeBy2" => [$data['madeBy2']]];
}
}
print_r(array_values($out));
This will leave an array indexed by the id
so I use array_values()
in the print_r()
, you can leave it in if you need it.
add a comment |
I build up an array which is indexed by the id
value from the data, if it's not already set then I create a new element with the data - although madeBy2
is created as an array. If the element already exists, then it adds the new value to the existing list of values ( using )...
$out = ;
foreach ( $inp as $data ) {
if ( isset ($out[$data['id']])) {
$out[$data['id']]["madeBy2"] = $data["madeBy2"];
}
else {
$out[$data['id']] = [ "id"=>$data['id'],
"regNumber" => $data['regNumber'],
"name" => $data['name'],
"madeBy2" => [$data['madeBy2']]];
}
}
print_r(array_values($out));
This will leave an array indexed by the id
so I use array_values()
in the print_r()
, you can leave it in if you need it.
add a comment |
I build up an array which is indexed by the id
value from the data, if it's not already set then I create a new element with the data - although madeBy2
is created as an array. If the element already exists, then it adds the new value to the existing list of values ( using )...
$out = ;
foreach ( $inp as $data ) {
if ( isset ($out[$data['id']])) {
$out[$data['id']]["madeBy2"] = $data["madeBy2"];
}
else {
$out[$data['id']] = [ "id"=>$data['id'],
"regNumber" => $data['regNumber'],
"name" => $data['name'],
"madeBy2" => [$data['madeBy2']]];
}
}
print_r(array_values($out));
This will leave an array indexed by the id
so I use array_values()
in the print_r()
, you can leave it in if you need it.
I build up an array which is indexed by the id
value from the data, if it's not already set then I create a new element with the data - although madeBy2
is created as an array. If the element already exists, then it adds the new value to the existing list of values ( using )...
$out = ;
foreach ( $inp as $data ) {
if ( isset ($out[$data['id']])) {
$out[$data['id']]["madeBy2"] = $data["madeBy2"];
}
else {
$out[$data['id']] = [ "id"=>$data['id'],
"regNumber" => $data['regNumber'],
"name" => $data['name'],
"madeBy2" => [$data['madeBy2']]];
}
}
print_r(array_values($out));
This will leave an array indexed by the id
so I use array_values()
in the print_r()
, you can leave it in if you need it.
answered Nov 16 '18 at 7:46
Nigel RenNigel Ren
28.3k62034
28.3k62034
add a comment |
add a comment |
Comments in code
foreach ($array as $arr) {
if(!isset($output[$arr["id"]])){ // if item does not exist
$output[$arr["id"]] = $arr; // create array
$output[$arr["id"]]['madeBy2'] = [$output[$arr["id"]]['madeBy2']]; // change type on madeBy2 to array
}else{
$output[$arr["id"]]['madeBy2'] = $arr['madeBy2']; // it item exist add madeBy2 to the list
}
}
$output = array_values($output); // remove associative array keys.
print_r($output);
This method does not rely on the list being sorted and only madeBy2 is hardcode.
Meaning if one array has an extra item this method will keep it opposed to Nigel's.
Output:
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100nSMD060310%X7R25V
[madeBy2] => Array
(
[0] => Pro_SinoskysunInternational(HK) CO.,LTD
[1] => Pro_RUTRONIKElektronischeBa
[2] => Pro_TTI
[3] => Pro_ARROWCENTRALEUROPEGMBH
[4] => Pro_TDK
[5] => Pro_YANGZHIDINGELECTRONICS
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] => Array
(
[0] =>
)
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
[0] => Pro_TDK
)
)
)
https://3v4l.org/iCjk1
Demo with extra item:
https://3v4l.org/0jmpL
add a comment |
Comments in code
foreach ($array as $arr) {
if(!isset($output[$arr["id"]])){ // if item does not exist
$output[$arr["id"]] = $arr; // create array
$output[$arr["id"]]['madeBy2'] = [$output[$arr["id"]]['madeBy2']]; // change type on madeBy2 to array
}else{
$output[$arr["id"]]['madeBy2'] = $arr['madeBy2']; // it item exist add madeBy2 to the list
}
}
$output = array_values($output); // remove associative array keys.
print_r($output);
This method does not rely on the list being sorted and only madeBy2 is hardcode.
Meaning if one array has an extra item this method will keep it opposed to Nigel's.
Output:
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100nSMD060310%X7R25V
[madeBy2] => Array
(
[0] => Pro_SinoskysunInternational(HK) CO.,LTD
[1] => Pro_RUTRONIKElektronischeBa
[2] => Pro_TTI
[3] => Pro_ARROWCENTRALEUROPEGMBH
[4] => Pro_TDK
[5] => Pro_YANGZHIDINGELECTRONICS
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] => Array
(
[0] =>
)
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
[0] => Pro_TDK
)
)
)
https://3v4l.org/iCjk1
Demo with extra item:
https://3v4l.org/0jmpL
add a comment |
Comments in code
foreach ($array as $arr) {
if(!isset($output[$arr["id"]])){ // if item does not exist
$output[$arr["id"]] = $arr; // create array
$output[$arr["id"]]['madeBy2'] = [$output[$arr["id"]]['madeBy2']]; // change type on madeBy2 to array
}else{
$output[$arr["id"]]['madeBy2'] = $arr['madeBy2']; // it item exist add madeBy2 to the list
}
}
$output = array_values($output); // remove associative array keys.
print_r($output);
This method does not rely on the list being sorted and only madeBy2 is hardcode.
Meaning if one array has an extra item this method will keep it opposed to Nigel's.
Output:
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100nSMD060310%X7R25V
[madeBy2] => Array
(
[0] => Pro_SinoskysunInternational(HK) CO.,LTD
[1] => Pro_RUTRONIKElektronischeBa
[2] => Pro_TTI
[3] => Pro_ARROWCENTRALEUROPEGMBH
[4] => Pro_TDK
[5] => Pro_YANGZHIDINGELECTRONICS
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] => Array
(
[0] =>
)
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
[0] => Pro_TDK
)
)
)
https://3v4l.org/iCjk1
Demo with extra item:
https://3v4l.org/0jmpL
Comments in code
foreach ($array as $arr) {
if(!isset($output[$arr["id"]])){ // if item does not exist
$output[$arr["id"]] = $arr; // create array
$output[$arr["id"]]['madeBy2'] = [$output[$arr["id"]]['madeBy2']]; // change type on madeBy2 to array
}else{
$output[$arr["id"]]['madeBy2'] = $arr['madeBy2']; // it item exist add madeBy2 to the list
}
}
$output = array_values($output); // remove associative array keys.
print_r($output);
This method does not rely on the list being sorted and only madeBy2 is hardcode.
Meaning if one array has an extra item this method will keep it opposed to Nigel's.
Output:
Array
(
[0] => Array
(
[id] => 41844
[regNumber] => CSM-057.05
[name] => 100nSMD060310%X7R25V
[madeBy2] => Array
(
[0] => Pro_SinoskysunInternational(HK) CO.,LTD
[1] => Pro_RUTRONIKElektronischeBa
[2] => Pro_TTI
[3] => Pro_ARROWCENTRALEUROPEGMBH
[4] => Pro_TDK
[5] => Pro_YANGZHIDINGELECTRONICS
)
)
[1] => Array
(
[id] => 41301
[regNumber] => P+CSM-302.01
[name] => 100n SMD 0603 5% X7R 25V
[madeBy2] => Array
(
[0] =>
)
)
[2] => Array
(
[id] => 24526
[regNumber] => P+CSM-097.04
[name] => 100n SMD 0603 10% X7R 25V
[madeBy2] => Array
(
[0] => Pro_TDK
)
)
)
https://3v4l.org/iCjk1
Demo with extra item:
https://3v4l.org/0jmpL
answered Nov 16 '18 at 10:36
AndreasAndreas
16.9k41844
16.9k41844
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53333032%2farray-merge-to-multidimensional-by-key%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Have you tried anything so far?
– Nigel Ren
Nov 16 '18 at 7:14
I will say that it can be done, and it would not even be that hard. You will have to iterate over the firts array and add element to their respective places in second array during the iteration of the first
– Eugene Anisiutkin
Nov 16 '18 at 7:20
@NigelRen yep i've.. also i've tried to looking on stack for answers too but nothing from it was working as i wanted.. :( Iam learning by myself so its lil harder for me to solve things by myself.. I tried it for few hrs but with no result
– Daniel Sympho Weiss
Nov 16 '18 at 7:22