Search code examples
phparrayssortingduplicatesarray-merge

Merge two flat arrays, remove duplicates and empty elements, then custom sort


I have two arrays like below:

$array1 = array(
    'cover.xhtml',
    'title.xhtml',
    'copyright.xhtml',
    'dedication.xhtml',
    'toc_brief.xhtml',
    'toc.xhtml',
    'ch02_1.xhtml',
    'ch02_2.xhtml',
    'ch02_3.xhtml',
    'ch02_4.xhtml',
    'ch02_5.xhtml',
    'ch02_6.xhtml',
    'ch02_7.xhtml',
    'ch02_8.xhtml',
    'ch02_9.xhtml',
    'ch02_10.xhtml'
);

$array2 = array(
    '',
    'title.xhtml',
    'copyright.xhtml',
    'dedication.xhtml',
    'ch02_2.xhtml',
    'ch02_2#454.xhtml',
    'ch02_4.xhtml',
    'ch02_1.xhtml',
    'ch02_11.xhtml',
    'ch02_12.xhtml',
    ''
);

Desired sorted array:

array(
    'cover.xhtml',
    'title.xhtml',
    'copyright.xhtml',
    'dedication.xhtml',
    'toc_brief.xhtml',
    'toc.xhtml',
    'ch02_1.xhtml',
    'ch02_2.xhtml',
    'ch02_2#454.xhtml',
    'ch02_3.xhtml',
    'ch02_4.xhtml',
    'ch02_5.xhtml',
    'ch02_6.xhtml',
    'ch02_7.xhtml',
    'ch02_8.xhtml',
    'ch02_9.xhtml',
    'ch02_10.xhtml',
    'ch02_11.xhtml',
    'ch02_12.xhtml'
)

I tried with: call_user_func_array('array_merge', array_map(null, $array1, $array2));

This did not produce the result that I need.


Solution

  • If the order doesn't really matter, use:

    $array3 = array_values(array_unique(array_filter(array_merge($array1, $array2))));
    

    Output:

    Array
    (
        [0] => cover.xhtml
        [1] => title.xhtml
        [2] => copyright.xhtml
        [3] => dedication.xhtml
        [4] => toc_brief.xhtml
        [5] => toc.xhtml
        [6] => ch02_1.xhtml
        [7] => ch02_2.xhtml
        [8] => ch02_3.xhtml
        [9] => ch02_4.xhtml
        [10] => ch02_5.xhtml
        [11] => ch02_6.xhtml
        [12] => ch02_7.xhtml
        [13] => ch02_8.xhtml
        [14] => ch02_9.xhtml
        [15] => ch02_10.xhtml
        [16] => ch02_2#454.xhtml
        [17] => ch02_11.xhtml
        [18] => ch02_12.xhtml
    )
    

    Check it out here. The code does the following: merge -> remove empty -> remove duplicates -> fix keys.