AronTito
@AronTito
разработчик-любитель web приложений и сайтов.

Работа с многомерный массивом в РНР?

Всем привет.
Помогите решить одну задачку с одним массивом данный, который получил через API.
Вот сам массив
$arr = [
	0 => [
		'ID' => 1,
		'CODE' => 200,
		'NUMBER' => 10001
		'DATE' => '2020-03-01T11:00:00'
	],
	1 => [
		'ID' => 2,
		'CODE' => 300,
		'NUMBER' => 10001
		'DATE' => '2020-03-01T10:50:00'
	],
	2 => [
		'ID' => 3,
		'CODE' => 200,
		'NUMBER' => 10002
		'DATE' => '2020-03-01T10:45:00'
	],
	3 => [
		'ID' => 4,
		'CODE' => 300,
		'NUMBER' => 10001
		'DATE' => '2020-03-01T10:37:00'
	],
	4 => [
		'ID' => 5,
		'CODE' => 300,
		'NUMBER' => 10002
		'DATE' => '2020-03-01T10:35:00'
	],
	5 => [
		'ID' => 6,
		'CODE' => 300,
		'NUMBER' => 10002
		'DATE' => '2020-03-01T10:10:00'
	],
	6 => [
		'ID' => 7,
		'CODE' => 300,
		'NUMBER' => 10003
		'DATE' => '2020-03-01T10:00:00'
	],
];

Мне нужно в результате получить массив, но с небольшими изменениями \ фильтрации
1. - удалить элементы из массива, с одинаковым значениям ключа NUMBER, но при этом, тот элемент который будет удален, должен иметь CODE => 300
РЕЗУЛЬТАТ должен быть таким
# были удалены  5/3
$arr = [
	0 => [
		'ID' => 1,
		'CODE' => 200,
		'NUMBER' => 10001
		'DATE' => '2020-03-01T11:00:00'
	],
	1 => [
		'ID' => 2,
		'CODE' => 300,
		'NUMBER' => 10001
		'DATE' => '2020-03-01T10:50:00'
	],
	2 => [
		'ID' => 3,
		'CODE' => 200,
		'NUMBER' => 10002
		'DATE' => '2020-03-01T10:45:00'
	],
	4 => [
		'ID' => 5,
		'CODE' => 300,
		'NUMBER' => 10002
		'DATE' => '2020-03-01T10:35:00'
	],
	6 => [
		'ID' => 7,
		'CODE' => 300,
		'NUMBER' => 10003
		'DATE' => '2020-03-01T10:00:00'
	],
];

После:
2. Найти все NUMBER с CODE => 300 и проверить если-ли такой-же NUMBER НО! уже с CODE => 200?
- если ДА - удалить их из массива
- если НЕТ - оставить только NUMBER с CODE => 300
# Вот что должно остаться
$arr = [
	6 => [
		'ID' => 7,
		'CODE' => 300,
		'NUMBER' => 10003
		'DATE' => '2020-03-01T10:00:00'
	],
];

Спасибо всем, кто уделит внимание вопросу.
  • Вопрос задан
  • 172 просмотра
Решения вопроса 1
Уверен, что можно проще.

Function:
function handler(array $input): array
{
    $output = $input;

    $idsForDelete = [];
    foreach ($input as $i => $item) {
        $code   = $item['CODE'];
        $number = $item['NUMBER'];

        if ($code !== 300) {
            continue;
        }

        $key = $number . '-' . $code;

        if (isset($idsForDelete[$key])) {
            $idsForDelete[$key][] = $i;
        } else {
            $idsForDelete[$key] = [];
        }
    }

    foreach ($idsForDelete as $ids) {
        foreach ($ids as $i => $id) {
            unset($output[$id]);
        }
    }

    $arrayWith200 = [];
    $arrayWith300 = [];

    foreach ($output as $i => $item) {
        $code   = $item['CODE'];
        $number = $item['NUMBER'];

        if ($code === 200) {
            $arrayWith200[$i] = $number;
        }

        if ($code === 300) {
            $arrayWith300[$i] = $number;
        }
    }

    foreach ($arrayWith300 as $i => $number) {
        $key = array_search($number, $arrayWith200);

        if ($key === false) {
            continue;
        }

        unset($output[$i]);
        unset($output[$key]);
    }

    return $output;
}


Result:
print_r(handler($arr));

Output:
Array
(
    [6] => Array
        (
            [ID] => 7
            [CODE] => 300
            [NUMBER] => 10003
            [DATE] => 2020-03-01T10:00:00
        )

)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Два раза вызываете array_walk_recursive() с двумя своими функциями-обработчиками.

Или делаете тупо: через foreach-цикл и там всё по ключам отсеиваете.
Ответ написан
@vasiiil
По-моему, пункт 2 не имеет смысла, тк после выполнения пункта 1 в массиве не должно остаться элементов с одинаковыми полями NUMBER. Почему в примере не удалились $arr[1] и $arr[4]?
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы