Возврат только уникальных значений из нескольких массивов

Мой массив содержит следующее:

Array ( [0] => Events - Central [1] => Central [2] => Finance [3] => 17 [5] => 11 [8] => 11  )
Array ( [0] => Events - Central [1] => Central [2] => HR [3] => 17 [5] => 11 [8] => 11 )
Array ( [0] => Events - Central [1] => Central [2] => IT [3] => 17 [5] => 11 [8] => 11  )
Array ( [0] => Events - Central [1] => London [2] => Sales [3] => 17 [5] => 11 [8] => 11  )
Array ( [0] => Events - Central [1] => London [2] => Marketing [3] => 17 [5] => 11 [8] => 11 )
Array ( [0] => Events - Central [1] => London [2] => HR [3] => 17 [5] => 11 [8] => 11  )
Array ( [0] => Piloting [1] => London [2] => HR [3] => 17 [5] => 11 [8] => 11  )
Array ( [0] => Piloting [1] => London [2] => IT [3] => 17 [5] => 11 [8] => 11  )

Теперь, используя простой WHILE цикл позволяет мне циклически проходить по массиву, и я могу легко извлечь нужную информацию, но я изо всех сил, потому что мне нужно вернуть различные значения (и я не могу изменить SQL код).

Результатом будет простая таблица, подобная этой, но обратите внимание, что уровни 1 и 2 таблицы не повторяются:

Events - Central          17
Central               17
Finance           11
HR                 1
IT                 1
London                28
Sales             17
Marketing          2
HR                 5
Piloting                  37
London                37
HR                 30
IT                  7

Короче я пытаюсь вернуть distinct случаи — если это имеет смысл?

Возможно ли это даже без деконструкции массива?

Я очень уверен, что, возможно, я не проиллюстрировал / не сформулировал этот вопрос хорошо.

0

Решение

Вот что вы можете сделать, чтобы (а) отобразить нужные данные и (б) создать массив с указанными данными, расплывчатыми так, чтобы вы могли работать с ними:

<?php
$superArray = [
[ "Events - Central", "Central", "Finance",   17, 0, 11, 0, 0, 11, 0 ],
[ "Events - Central", "Central", "HR",        17, 0, 11, 0, 0, 11, 0 ],
[ "Events - Central", "Central", "IT",        17, 0, 11, 0, 0, 11, 0 ],
[ "Events - Central", "London",  "Sales",     17, 0, 11, 0, 0, 11, 0 ],
[ "Events - Central", "London",  "Marketing", 17, 0, 11, 0, 0, 11, 0 ],
[ "Events - Central", "London",  "HR",        17, 0, 11, 0, 0, 11, 0 ],
[ "Piloting",         "London",  "HR",        17, 0, 11, 0, 0, 11, 0  ],
[ "Piloting",         "London",  "IT",        17, 0, 11, 0, 0, 11, 0 ]
];usort($superArray, function ($a,$b) {
return $a[0] == $b[0] && $a[1]==$b[1]
? $a[2]<=>$b[2]
: (
$a[0] == $b[0]
?$a[1]<=>$b[1]
:$a[0]<=>$b[0]
);
});

$lastSeen = [];
$buildArray = [];

foreach ($superArray as $array) {

if (!isset($lastSeen[0]) || $lastSeen[0] != $array[0]) {
$lastSeen[0] = $array[0];
$lastSeen[1] = null;
echo $array[0]."\t".$array[3].PHP_EOL;
$buildArray[]= [
"level" => 0,
"name" => $array[0],
"value" => $array[3]
];
}
if (!isset($lastSeen[1]) || $lastSeen[1] != $array[1]) {
$lastSeen[1] = $array[1];
$lastSeen[2] = null;
echo "\t".$array[1]."\t".$array[5].PHP_EOL;
$buildArray[]= [
"level" => 1,
"name" => $array[1],
"value" => $array[5]
];

}
if (!isset($lastSeen[2]) || $lastSeen[2] != $array[2]) {
$lastSeen[2] = $array[2];
echo "\t\t".$array[2]."\t".$array[8].PHP_EOL;
$buildArray[]= [
"level" => 2,
"name" => $array[2],
"value" => $array[8]
];

}

}print_r($buildArray);

Это напечатает:

Events - Central    17
Central 11
Finance 11
HR  11
IT  11
London  11
HR  11
Marketing   11
Sales   11
Piloting    17
London  11
HR  11
IT  11

Структура массива будет:

Array
(
[0] => Array
(
[level] => 0
[name] => Events - Central
[value] => 17
)

[1] => Array
(
[level] => 1
[name] => Central
[value] => 11
)

[2] => Array
(
[level] => 2
[name] => Finance
[value] => 11
)

[3] => Array
(
[level] => 2
[name] => HR
[value] => 11
)

[4] => Array
(
[level] => 2
[name] => IT
[value] => 11
)

[5] => Array
(
[level] => 1
[name] => London
[value] => 11
)

[6] => Array
(
[level] => 2
[name] => HR
[value] => 11
)

[7] => Array
(
[level] => 2
[name] => Marketing
[value] => 11
)

[8] => Array
(
[level] => 2
[name] => Sales
[value] => 11
)

[9] => Array
(
[level] => 0
[name] => Piloting
[value] => 17
)

[10] => Array
(
[level] => 1
[name] => London
[value] => 11
)

[11] => Array
(
[level] => 2
[name] => HR
[value] => 11
)

[12] => Array
(
[level] => 2
[name] => IT
[value] => 11
)

)

Идея состоит в том, чтобы сначала поместить все массивы в объединенный массив, а затем отсортировать их в соответствии с приоритетами (хотя я думаю, что они уже отсортированы). Сделав это, вы отслеживаете то, что видели для каждого уровня, и восстанавливаете массив на основе этого.

Имейте в виду, что это очень жестко закодированный материал, но, возможно, вы могли бы обобщить его, если вам нужно.

Пример на: http://sandbox.onlinephpfunctions.com/code/bf92828a5561d59d503e5765cc6b566a5acc0532

1

Другие решения

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

$data = [];
$data[] = [0 => 'Events - Central', 1 => 'Central', 2 => 'Finance', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Events - Central', 1 => 'Central', 2 => 'HR', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Events - Central', 1 => 'Central', 2 => 'IT', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Events - Central', 1 => 'London', 2 => 'Sales', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Events - Central', 1 => 'London', 2 => 'Marketing', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Events - Central', 1 => 'London', 2 => 'HR', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Piloting', 1 => 'London', 2 => 'HR', 3 => 17, 5 => 11, 8 => 11];
$data[] = [0 => 'Piloting', 1 => 'London', 2 => 'IT', 3 => 17, 5 => 11, 8 => 11];

$tree_root = [];

// map the keys in the $data array to each other
$caption_to_value_mapping = [
0 => 3,
1 => 5,
2 => 8
];

foreach ($data as $datum) {
$sub_tree = &$tree_root;
foreach ($caption_to_value_mapping as $level_index => $value) {
$caption = $datum[$level_index];
if (!isset($sub_tree[$caption])) {
$sub_tree[$caption] = ['next_level' => []];
}
$sub_tree[$caption]['caption'] = $caption;
$sub_tree[$caption]['value'] = $datum[$value];
$sub_tree = &$sub_tree[$caption]['next_level'];
}
}

var_dump($tree_root);

Затем вы можете использовать $ tree_root в рекурсивной функции для построения отображения данных.

Обратите внимание, что это универсально и займет любое количество уровней, если поддерживается $ caption_to_value_mapping.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector