相交两个相似的数组

时间:2019-07-18 10:45:24

标签: php arrays

我有两个数组,第一个是第二个数组的排序版本(由用户排序),但是第二个数组可以比第一个数组短或长。例如:

$books_sorted = array(
     0 => array(
        "title" => "In Search of Lost Time"
     ),
     1 => array(
        "title" => "Don Quixote"
     ),
     2 => array(
        "title" => "The Great Gatsby"
     )
);

$books_available = array(
      0 => array(
         "title" => "Moby Dick"
      ),
      1 => array(
         "title" => "In Search of Lost Time"
      ),
      2 => array(
         "title" => "The Great Gatsby"
      ),
      3 => array(
         "title" => "War and Peace"
      )
);

我需要第三个数组,该数组尊重用户设置的顺序,但从第二个数组中删除丢失的书,并在其末尾添加第二个数组中的所有新书。

// "Don Quixote" is not available anymore -> needs to be removed
// "War and Peace" and "Moby Dick" are available -> need to be added both at the end

$books_third_array = array(
     0 => array(
        "title" => "In Search of Lost Time"
     ),
     1 => array(
        "title" => "The Great Gatsby"
     ),
     2 => array(
        "title" => "Moby Dick"
     ),
     3 => array(
        "title" => "War and Peace"
     )    
);

我只输入“ title”键是因为还有其他键,但是我认为它们对本示例没有用。 感谢您的任何帮助,谢谢。

2 个答案:

答案 0 :(得分:3)

您可以在第一个数组中找到第二个数组中的所有元素,然后在第二个数组中找到不在第一个数组中的所有元素-并将两者组合。 array_filter将为您提供帮助。您将拥有这样的东西:

$sorted_titles = array_column($books_sorted, 'title');
$available_titles = array_column($books_available, 'title');

$third_array = array_merge(
    array_filter($books_sorted, function($e) use ($available_titles) {
        return in_array($e['title'], $available_titles);
    }),
    array_filter($books_available, function($e) use ($sorted_titles) {
        return !in_array($e['title'], $sorted_titles);
    })
);

实时演示:https://3v4l.org/fSpWm

根据评论进行编辑:

如果您不仅需要在第一个数组中保留其他“字段”,而且还需要将第二个数组中不存在的键复制到第一个数组中,则代码将变得更加复杂。这样的事情可能会做到:

$sorted_titles = array_column($books_sorted, 'title');
$available_titles = array_reduce($books_available, function($result, $e) {
    $result[$e['title']] = $e;
    return $result;
});

$third_array = array_merge(
    array_map(
        function($e) use ($available_titles) {
            return array_merge($available_titles[$e['title']], $e);
        },
        array_filter($books_sorted, function($e) use ($available_titles) {
            return in_array($e['title'], array_keys($available_titles));
        })
    ),
    array_filter($books_available, function($e) use ($sorted_titles) {
        return !in_array($e['title'], $sorted_titles);
    })
);

实时演示:https://3v4l.org/VZGbB

答案 1 :(得分:1)

使用usort()并定义自己的排序功能,使用use关键字传入已排序标题的数组,如果在数组中,则将其向上移动-否则将其向下移动。

$books_sorted_titles = array_column($books_sorted, 'title');
usort($books_available, function($k, $v) use ($books_sorted_titles) {
    return in_array($v['title'], $books_sorted_titles) ? 1 : -1;
});
相关问题