Reputation: 21
Here is my initial array:
$arr = array(
array('model'=>'123', 'garment'=>'coat', 'title'=>'aaa'),
array('model'=>'123', 'gender'=>'men', 'title'=>'aaa'),
array('model'=>'123', 'brand'=>'adidas', 'title'=>'aaa'),
array('model'=>'345', 'garment'=>'jacket', 'title'=>'bbb'),
array('model'=>'345', 'gender'=>'kids', 'title'=>'bbb'),
array('model'=>'345', 'brand'=>'nike', 'title'=>'bbb'),
array('model'=>'678', 'garment'=>'trainers', 'title'=>'ccc'),
array('model'=>'678', 'gender'=>'kids', 'title'=>'ccc'),
array('model'=>'678', 'brand'=>'', 'title'=>'ccc')
);
I would like to get to:
$result = array(
array('model'=>'123', 'garment'=>'coat', 'gender'=>'men', 'brand'=>'adidas', 'title'=>'aaa'),
array('model'=>'345', 'garment'=>'jacket', 'gender'=>'kids', 'brand'=>'nike', 'title'=>'bbb'),
array('model'=>'678', 'garment'=>'trainers', 'gender'=>'kids', 'brand'=>'', 'title'=>'ccc')
)
Would you please kindly help me - thank you. Here is my attempted solution, but I'm running out of memory when trying to source large arrays.
Here is step 1:
//---------------------- STEP 1 ------
$result = array();
foreach($arr as $line) {
$result[] = $line['model'];
}
$result = array_values(array_unique($result));
Here is step 2:
//---------------------- STEP 2 ------
foreach($result as $r) {
$inter = array();
$inter['model'] = $r;
foreach($arr as $line) {
if ($r == $line['model']){
if (!isset($inter['title']) && isset($line['title'])) {
$inter['title'] = $line['title'];
}
if (!isset($inter['garment']) && isset($line['garment'])) {
$inter['garment'] = $line['garment'];
}
if (!isset($inter['gender']) && isset($line['gender'])) {
$inter['gender'] = $line['gender'];
}
if (!isset($inter['brand']) && isset($line['brand'])) {
$inter['brand'] = $line['brand'];
}
}
}
if (!isset($inter['title'])) {
$inter['title'] = '';
}
if (!isset($inter['garment'])) {
$inter['garment'] = '';
}
if (!isset($inter['gender'])) {
$inter['gender'] = '';
}
if (!isset($inter['brand'])) {
$inter['brand'] = '';
}
$results[] = $inter;
unset($inter);
}
unset($result);
return $results;
Upvotes: 2
Views: 917
Reputation: 47764
My method assumes the input subarrays are in batches of 3.
The first empty associative array in array_replace()
serves to establish the key order desired by the OP.
I am using a splat operator ...
so php5.6+ is required.
The splat operator delivers all three subarrays in the chunk at once.
Code: (Demo)
$arr = array(
array('model'=>'123', 'garment'=>'coat', 'title'=>'aaa'),
array('model'=>'123', 'gender'=>'men', 'title'=>'aaa'),
array('model'=>'123', 'brand'=>'adidas', 'title'=>'aaa'),
array('model'=>'345', 'garment'=>'jacket', 'title'=>'bbb'),
array('model'=>'345', 'gender'=>'kids', 'title'=>'bbb'),
array('model'=>'345', 'brand'=>'nike', 'title'=>'bbb'),
array('model'=>'678', 'garment'=>'trainers', 'title'=>'ccc'),
array('model'=>'678', 'gender'=>'kids', 'title'=>'ccc'),
array('model'=>'678', 'brand'=>'', 'title'=>'ccc')
);
$key_order=['model'=>'','garment'=>'','gender'=>'','brand'=>'','title'=>''];
foreach(array_chunk($arr,3) as $a){
$result[]=array_replace($key_order,...$a);
}
var_export($result);
Output:
array (
0 =>
array (
'model' => '123',
'garment' => 'coat',
'gender' => 'men',
'brand' => 'adidas',
'title' => 'aaa',
),
1 =>
array (
'model' => '345',
'garment' => 'jacket',
'gender' => 'kids',
'brand' => 'nike',
'title' => 'bbb',
),
2 =>
array (
'model' => '678',
'garment' => 'trainers',
'gender' => 'kids',
'brand' => '',
'title' => 'ccc',
),
)
Upvotes: 0
Reputation: 79
$arr = array(
array('model'=>'123', 'garment'=>'coat', 'title'=>'aaa'),
array('model'=>'123', 'gender'=>'men', 'title'=>'aaa'),
array('model'=>'123', 'brand'=>'adidas', 'title'=>'aaa'),
array('model'=>'345', 'garment'=>'jacket', 'title'=>'bbb'),
array('model'=>'345', 'gender'=>'kids', 'title'=>'bbb'),
array('model'=>'345', 'brand'=>'nike', 'title'=>'bbb'),
array('model'=>'678', 'garment'=>'trainers', 'title'=>'ccc'),
array('model'=>'678', 'gender'=>'kids', 'title'=>'ccc'),
array('model'=>'678', 'brand'=>'', 'title'=>'ccc')
);
//var_dump($arr);
$arrRes = array();
$arrSort = array();
foreach($arr as $key => $v){
$key = array_search($v["model"],$arrSort,true);
if($key === false){
//key empty , insert model
$arrRes[] = $v;
$arrSort[] = $v["model"];
}
else{
foreach($v as $subKey => $subv){
if($subKey!="model"){
$arrRes[$key][$subKey] = $subv;
}
}
}
}
echo "<pre>";
var_dump($arrRes);
echo "</pre>";
I tried about 8000 lines , if your loop is run out of memory, clearly it got logic errors also , I don't think you can preserve the same string key name in an array.
Upvotes: 1
Reputation: 2947
<?php
$arr = array(
array('model'=>'123', 'garment'=>'coat', 'title'=>'aaa'),
array('model'=>'123', 'gender'=>'men', 'title'=>'aaa'),
array('model'=>'123', 'brand'=>'adidas', 'title'=>'aaa'),
array('model'=>'345', 'garment'=>'jacket', 'title'=>'bbb'),
array('model'=>'345', 'gender'=>'kids', 'title'=>'bbb'),
array('model'=>'345', 'brand'=>'nike', 'title'=>'bbb'),
array('model'=>'678', 'garment'=>'trainers', 'title'=>'ccc'),
array('model'=>'678', 'gender'=>'kids', 'title'=>'ccc'),
array('model'=>'678', 'brand'=>'', 'title'=>'ccc')
);
$new_arr = array();
foreach ($arr AS $tmp) {
$this_model = $tmp['model'];
if (!isset($new_arr[$this_model])) { $new_arr[$this_model] = array(); }
$new_arr[$this_model] = array_merge($new_arr[$this_model], $tmp);
}
print '<pre>';
var_dump($new_arr);
print '</pre>';
?>
Upvotes: 0