Я ищу построить новый массив, найдя пересечение заданного массива массивов.
Вероятно, это простая проблема теории множеств для большинства людей, но мне сложно обернуть голову вокруг.
Итак, у меня есть массив ключей:
$myArray = [
'array1' => [A, B, C],
'array2' => [A, B, C, D],
'array3' => [A, B, C, D],
'array4' => [D],
]
И цель состоит в том, чтобы создать совершенно новый массив, в который входят сцепленные ключи предыдущего массива, если они имеют пересечение:
В основном так:
$newArray = [
'array1,array2,array3' => [A, B, C],
'array2,array3,array4' => [D]
]
Так как array1, array2, array3 имеют ABC в команде, они будут формироваться как один массив с ключами, такой же как array2, array3, array4 и так далее.
Я попытался поэкспериментировать с array_intersect, но мне кажется, что он не тот, который я ищу, или, возможно, я решил его по-настоящему неправильно. Любые идеи очень ценятся.
$myArray = [
'array1' => [A, B, C],
'array2' => [A, B, C, D],
'array3' => [A, B, C, D],
'array4' => [D],
];$newArray = [];
$keys = array_keys($myArray);
for($i = 0, $size = count($myArray); $i < $size; $i++){
for($k = $i; $k < $size; $k++){
print_r(array_intersect($myArray[$keys[$i]], $myArray[$keys[$k]]));
}
}
//Foal
// 'array1,array2,array3' => [A, B, C]
// 'array2,array3,array4' => [D]
Этот код даст желаемый массив в качестве вывода.
$myArray = [
'array1' => ['A', 'B', 'C'],
'array2' => ['A', 'B', 'C', 'D'],
'array3' => ['A', 'B', 'C', 'D'],
'array4' => ['D'],
];
// Define new arrays
$newArray = [];
$finalArray = [];
// loop the array and create a new array with values like (A,B,C..) as keys
foreach($myArray as $key=>$value){
foreach($value as $k=>$v){
// if already value exists append new value with comma
$newArray[$v] = isset($newArray[$v]) ? $newArray[$v].','.$key:$key;
}
}
foreach($newArray as $key=>$value){
$finalArray[$value][] = $key;
}
print_r($finalArray);
Выход положен
Array
(
[array1,array2,array3] => Array
(
[0] => A
[1] => B
[2] => C
)
[array2,array3,array4] => Array
(
[0] => D
)
)
Других решений пока нет …