milinsky
@milinsky

Как отфильтровать массивы в многомерном массиве так, чтобы убрать одинаковые для всех массивов значения?

Есть многомерный массив, например:

$array = [
    0 => ['a' => 1, 'b' => 2, 'c' => 3],
    1 => ['a' => 1, 'b' => 3, 'c' => 3],
    2 => ['a' => 1, 'b' => 2, 'c' => 4],
    3 => ['a' => 1, 'b' => 2, 'c' => 3],
];


Нужно отфильтровать вложенные массивы так, чтобы на выходе получить многомерный массив содержащий массивы в которых есть только те элементы, значения которых не равны друг другу хотя бы в одном из массивов, с сохранением ключей. На выходе нужно получить

[
    0 => ['b' => 2, 'c' => 3],
    1 => ['b' => 3, 'c' => 3],
    2 => ['b' => 2, 'c' => 4],
    3 => ['b' => 2, 'c' => 3],
];


Количество вложенных массивов может быть разное, но ключи у всех одинаковые. По сути нужно убрать элементы в массивах если их значения по одному и тому же ключу во всех одинаковые.
  • Вопрос задан
  • 45 просмотров
Решения вопроса 1
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Ещё один вариант:
// найдем ключи с равными значениями
$equal_keys = array_keys(array_intersect_assoc(...$array));

foreach ($array as $k=>$val) {
        //  в цикле отфильтруем лишнее
	$array[$k] = array_filter(
    	$val,
		function ($key) use ($equal_keys) {
			return !in_array($key, $equal_keys);
		},
		ARRAY_FILTER_USE_KEY
	);
}


share PHP code
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
$array = [
    0 => ['a' => 1, 'b' => 2, 'c' => 3],
    1 => ['a' => 1, 'b' => 3, 'c' => 3],
    2 => ['a' => 1, 'b' => 2, 'c' => 4],
    3 => ['a' => 1, 'b' => 2, 'c' => 3],
];

$keys = array_keys($array[0]);

$keys = array_filter(
    $keys,
    function($key) use($array) {
        count(array_unique(array_column($array, $key);)) > 1;
    }
);

$array = array_map(
    function($el) use($keys) {
        return array_filter(
            $el,
            function($key) use($keys) {
                return in_array($key, $keys);
            },
            ARRAY_FILTER_USE_KEY
        );
    },
    $array
);

print_r($array);

/*
Array (
  [0] => Array (
    [b] => 2
    [c] => 3
  )
  [1] => Array (
    [b] => 3
    [c] => 3
  )
  [2] => Array (
    [b] => 2
    [c] => 4
  )
  [3] => Array (
    [b] => 2
    [c] => 3
  )
)
/*
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы