0

I have 2 arrays that I need merged to create another array with unique values. Array 2 is the entire list of possible file versions, and Array 1 is the current versions of the files. If items from Array 1 and Array 2 have the same id value, I want to take the item from Array 1.

Array 1

$array1 = array(
    array('id' => '8','file_extension_id' => '8','extension' => '','name' => 'GS','file_version' => '1.0.2'),
    array('id' => '2','file_extension_id' => '2','extension' => 'gif', 'name' => 'GIF','file_version' => '1.0.2'),
    array('id' => '1','file_extension_id' => '1','extension' => 'png','name' => 'PNG','file_version' => '1.0.2'),
    array('id' => '19','file_extension_id' => '19','extension' => 'jpg','name' => 'JPG','file_version' => '1.0.2'),
    array('id' => '20','file_extension_id' => '20','extension' => 'pdf','name' => 'PDF','file_version' => '1.0.2'),
);

Array 2

$array2 = array(
    array('id' => '1','file_extension_id' => '','extension' => 'png','name' => 'PNG','file_version' => ''),
    array('id' => '2','file_extension_id' => '','extension' => 'gif','name' => 'GIF','file_version' => ''),
    array('id' => '3','file_extension_id' => '','extension' => 'doc','name' => 'Word 2003','file_version' => ''),
    array('id' => '4','file_extension_id' => '','extension' => 'docx','name' => 'Word 2007+','file_version' => ''),
    array('id' => '5','file_extension_id' => '','extension' => 'xlsx','name' => 'Excel 2010+','file_version' => ''),
    array('id' => '6','file_extension_id' => '','extension' => 'docx','name' => 'Word 2010+','file_version' => ''),
    array('id' => '7','file_extension_id' => '','extension' => 'numbers','name' => 'Mac Numbers','file_version' => ''),
    array('id' => '8','file_extension_id' => '','extension' => '','name' => 'GS','file_version' => ''),
    array('id' => '9','file_extension_id' => '','extension' => '','name' => 'Google Docs','file_version' => ''),
    array('id' => '10','file_extension_id' => '','extension' => 'ots','name' => 'OpenOffice.org Calc','file_version' => ''),
    array('id' => '11','file_extension_id' => '','extension' => 'ott','name' => 'OpenOffice.org Writer','file_version' => ''),
    array('id' => '12','file_extension_id' => '','extension' => 'xlsx','name' => 'Excel for iPad','file_version' => ''),
    array('id' => '13','file_extension_id' => '','extension' => 'xlsm','name' => 'Excel 2007 Macros','file_version' => ''),
    array('id' => '14','file_extension_id' => '','extension' => 'xlsm','name' => 'Excel 2010 Macros','file_version' => ''),
    array('id' => '15','file_extension_id' => '','extension' => 'xlsx','name' => 'Excel 2013+','file_version' => ''),
    array('id' => '16','file_extension_id' => '','extension' => 'xlsm','name' => 'Excel 2013 Macros','file_version' => ''),
    array('id' => '17','file_extension_id' => '','extension' => 'xlsx','name' => 'Excel 2016','file_version' => ''),
    array('id' => '18','file_extension_id' => '','extension' => 'xlsm','name' => 'Excel 2016 Macros','file_version' => ''),
    array('id' => '19','file_extension_id' => '','extension' => 'jpg','name' => 'JPG','file_version' => ''),
    array('id' => '20','file_extension_id' => '','extension' => 'pdf','name' => 'PDF','file_version' => ''),
    array('id' => '21','file_extension_id' => '','extension' => 'xlsx','name' => 'Excel for iPhone','file_version' => ''),
    array('id' => '22','file_extension_id' => '','extension' => 'xlsx','name' => 'Excel for Android','file_version' => ''),
    array('id' => '23','file_extension_id' => '','extension' => 'xls','name' => 'Excel 2003 Macros','file_version' => ''),
    array('id' => '24','file_extension_id' => '','extension' => 'docx','name' => 'Word 2013+','file_version' => ''),
    array('id' => '25','file_extension_id' => '','extension' => 'docx','name' => 'Word 2016','file_version' => '')
);

I keep getting an error when trying to use the following:

$fileInVersion = array_merge($fileExists,$soft);
print_r(array_unique($fileInVersion));

Here is an error:

Notice: Array to string conversion in /file.php on line 30

The line 30 is print_r()

How can I merge these arrays together with unique values for id?

Don't Panic
  • 41,125
  • 10
  • 61
  • 80
AlexB
  • 2,164
  • 6
  • 27
  • 61

3 Answers3

3

array_unique() is designed to compare 2 dimensional arrays by default. If you want to compare arrays with more than one level, you need to pass in SORT_REGULAR as the second parameter of array_unique().

print_r(array_unique($fileInVersion, SORT_REGULAR));
Lloyd Banks
  • 35,740
  • 58
  • 156
  • 248
  • Thank, but I still get 29 keys instead of 25 so there are 4 keys that are still duplicate values. Any ideas why? – AlexB Jul 29 '16 at 21:06
  • @AlexB Your array values aren't equal. The sub-arrays in the second array you are comparing all have `null` for `file_version` while the corresponding sub_arrays in the first array have `1.0.2` for `file_version`. These sub-array values must be exactly equal. – Lloyd Banks Jul 29 '16 at 21:15
  • So as file_extension_id, but both of this parameters are irrelevant as I only really need to compare id. Is there any way around it? – AlexB Jul 29 '16 at 21:20
  • @AlexB You can't do that with `array_unique()`. It wouldn't know which of the two overlapping sub-arrays to keep in case of conflict like you have here. You'll have to run a custom `for` loop and insert your own logic for resolving the conflict. – Lloyd Banks Jul 29 '16 at 21:55
1

First reindex $array2 using id. array_column can make this easy:

$array2 = array_column($array2, null, 'id');

Then overwrite the keys in $array2 for each value in $array1 that has a matching 'id' key.

foreach ($array1 as $key => $value) {
    $array2[$value['id']] = $value;
}
Don't Panic
  • 41,125
  • 10
  • 61
  • 80
0

array_unique() is not intended to work on multi dimensional arrays. Use the below code for multi dimensional arrays

$fileInVersion = array_merge($fileExists,$soft);
$unique_array = array_map("unserialize", array_unique(array_map("serialize", $fileInVersion)));
print_r($unique_array);
Ravinder Reddy
  • 3,869
  • 1
  • 13
  • 22