我有两个数组,第一个是第二个数组的排序版本(由用户排序),但是第二个数组可以比第一个数组短或长。例如:
$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”键是因为还有其他键,但是我认为它们对本示例没有用。 感谢您的任何帮助,谢谢。
答案 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);
})
);
根据评论进行编辑:
如果您不仅需要在第一个数组中保留其他“字段”,而且还需要将第二个数组中不存在的键复制到第一个数组中,则代码将变得更加复杂。这样的事情可能会做到:
$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);
})
);
答案 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;
});