Как проверить условие в заданных трех массивах - PullRequest
1 голос
/ 08 марта 2019

У меня есть три массива

  1. themesSelected
  2. relayvantGroups
  3. topicAssingned
$topicsSelected = [ "T-100","T-600"];

$relavantGroups = [[ "id" => "G-001","name" => "3 A","active"=> false ], ["id"=> "G-002","name"=> "3 B","active"=> false]  ];

$topicAssingned = [
    "G-001" => [
        "groupID" => "G-001",
        "groupName" => "3 A",
        "topics" => [
            "T-100" => [
                "topicID" => "T-100"
            ],
            "T-200" => [
                "topicID" => "T-200"
            ]
        ]
    ],
    "G-002" => [
        "groupID" => "G-002",
        "groupName" => "3 B",
        "topics" => [
            "T-400" => [
                "topicID" => "T-400"
            ],
            "T-500" => [
                "topicID" => "T-500"
            ]
        ]
    ],
];

$ themesВыбранные значения массива (T-100 или T-600) в массиве $ topicAssingned должно быть указано хотя бы одно значение на основе groupID (G-001).$ topicAssedned по темам, topicID: T-100 равен присутствует , поэтому Disable : D

$ themes Выбранные значения массива (T-100 или T-600) должны содержать хотя бы одно значение в $topicAssingned массив, основанный на groupID (G-002).$ topicAssned по темам, topicID: T-100 & T-600 отсутствует , поэтому Disable : A

Ожидаемый результат:

[
     "id": "G-001",
    "name": "3 A",
    "active": false,
    "Disable" : "D"
],
[
     "id": "G-002",
    "name": "3 B",
    "active": false,
    "Disable" : "A"
]

MyКод

    foreach ($relavantGroups as &$g) {
    $found = false;
    foreach ($topicAssingned as $key => $assigned) {
        if ($key === $g["id"]) {
            $found = true;
            break;
        }
    }
    $g["disable"] = $found ? "D" : "A";
}
echo "<pre>";
print_r($relavantGroups);

Мой вывод

    Array
(
    [0] => Array
        (
            [id] => G-001
            [name] => 3 A
            [active] => 
            [disable] => D
        )

    [1] => Array
        (
            [id] => G-002
            [name] => 3 B
            [active] => 
            [disable] => D
        )

)

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Вы можете попробовать этот фрагмент,

foreach ($relavantGroups as &$g) {
    $found = false;
    foreach ($topicAssingned as $key => $assigned) {
        if ($key === $g["id"]) {
            $temp  = array_keys($assigned['topics']); // fetching all topic ids
            $intr  = array_intersect($topicsSelected, $temp); // checking if there are any matching values between topicSelected and traversed values
            $found = (!empty($intr) ? true : false); // if found return and break
            break;
        }
    }
    $g["disable"] = $found ? "D" : "A";
}
print_r($relavantGroups);

array_intersect - Вычисляет пересечение массивов
array_keys - Возвращает все ключи или подмножествоключи массива

Выход

Array
(
    [0] => Array
        (
            [id] => G-001
            [name] => 3 A
            [active] => 
            [disable] => D
        )

    [1] => Array
        (
            [id] => G-002
            [name] => 3 B
            [active] => 
            [disable] => A
        )

)

Демо

0 голосов
/ 08 марта 2019

В данный момент вы вообще не используете массив $topicsSelected - вы просто говорите, что идентификатор найден, а затем помечаете его как найденный. Вместо этого, как только вы найдете элемент, вам нужно проверить, есть ли выбор в списке тем в элементе.

Поскольку у вас есть идентификатор в качестве ключа к переменной $topicAssingned, вам не нужно искать его, просто обратитесь к нему по ключу, а затем извлеките список тем, используя array_keys(). Затем вы можете просто проверить, совпадают ли какие-либо из них, используя array_intersect() ...

foreach ($relavantGroups as &$g) {
    // List of topics in assigned
    $listTopics = array_keys($topicAssingned[$g["id"]]["topics"]);
    // Check for match between selected and topics in group
    $g["disable"] = array_intersect($topicsSelected, $listTopics) ? "D" : "A";
}
echo "<pre>";
print_r($relavantGroups);
...