Фильтрация по строковому значению?
Приветствую. Условно есть массив с описанием значений от "старшего" к "младшему"
["group.phantom", "group.god", "group.imperator", "group.general", "group.hermit", "group.soldier"] |
["group.phantom", "group.god", "group.imperator", "group.general", "group.hermit", "group.soldier"]
, а также входные данные:
[ [ "permission" => "group.default" ], [ "permission" => "group.phantom" ], [ "permission" => "group.general" ] ] |
[ [ "permission" => "group.default" ], [ "permission" => "group.phantom" ], [ "permission" => "group.general" ] ]
Так вот, как получить "старшее" значение permission из входных данных?
Дополнительно:
Свои идеи как делать есть?
Вам надо перебрать первый массив по одному элементу и проверять, есть ли текущее значение во втором массиве. Если есть, то это и есть ваше "старшее" значение. Логично?
Какая из этих операций вызывает трудности?
$a = ["group.phantom", "group.god", "group.imperator", "group.general", "group.hermit", "group.soldier"]; $b = [ [ "permission" => "group.default" ], [ "permission" => "group.phantom" ], [ "permission" => "group.hermit" ], [ "permission" => "group.imperator" ], [ "permission" => "group.god" ], ]; function getItem($a, $b) { foreach ($a as $item) { foreach ($b as $data_arr => $data) { if ($item == $data['permission']) return $item; } } } print getItem($a, $b); |
$a = ["group.phantom", "group.god", "group.imperator", "group.general", "group.hermit", "group.soldier"]; $b = [ [ "permission" => "group.default" ], [ "permission" => "group.phantom" ], [ "permission" => "group.hermit" ], [ "permission" => "group.imperator" ], [ "permission" => "group.god" ], ]; function getItem($a, $b) { foreach ($a as $item) { foreach ($b as $data_arr => $data) { if ($item == $data['permission']) return $item; } } } print getItem($a, $b);
Ответы:
<?php $priorities = ["group.phantom", "group.god", "group.imperator", "group.general", "group.hermit", "group.soldier"]; $permissions = [ [ "permission" => "group.default" ], [ "permission" => "group.phantom" ], [ "permission" => "group.general" ] ]; $defaultPriority = 'group.default'; $defaultPriorityIndex = count($priorities); $topPriorityIndex = $defaultPriorityIndex; foreach ($permissions as $permission) { $index = array_search($permission['permission'], $priorities); if ($index !== false && $index < $topPriorityIndex) { $topPriorityIndex = $index; } } $topPriority = ($topPriorityIndex == $defaultPriorityIndex) ? $defaultPriority : $priorities[$topPriorityIndex]; |
<?php $priorities = ["group.phantom", "group.god", "group.imperator", "group.general", "group.hermit", "group.soldier"]; $permissions = [ [ "permission" => "group.default" ], [ "permission" => "group.phantom" ], [ "permission" => "group.general" ] ]; $defaultPriority = 'group.default'; $defaultPriorityIndex = count($priorities); $topPriorityIndex = $defaultPriorityIndex; foreach ($permissions as $permission) { $index = array_search($permission['permission'], $priorities); if ($index !== false && $index < $topPriorityIndex) { $topPriorityIndex = $index; } } $topPriority = ($topPriorityIndex == $defaultPriorityIndex) ? $defaultPriority : $priorities[$topPriorityIndex];
- $priorities надо было foreach-ить, именно они удобно отсортированы по снижению веса.
И сразу break при совпадении, оптимизация однако. - Вот именно, это стыдоба, а не код. Надо переделать.
А потом попробовать сделать в одну строчку, встроенными функциями - Ипатьев, и где ваш код в одну строчку, что за бесполезный куратор...
- Все надо делать постепенно.
Сначала напишите оптимальный код с явным циклом, а потом уже можно переходить к синтаксическому сахару :) - Егор Мокеев, очень печально, что вы даже не пытаетесь сделать самостоятельно, а только и можете, что просить готовенькое
Я добавил ответ с коротким решением
Плюс ниже есть корректное решение с явным перебором
Ну и просто для комплекта, решение с использованием функций для работы с массивами
$permission = array_values(array_intersect($a, array_column($b, 'permission')))[0] ?? null; |
$permission = array_values(array_intersect($a, array_column($b, 'permission')))[0] ?? null;
array_column() сделает из $b нормальный массив, без этих бессмысленных "permission"
array_intersect собственно вернет пересечение двух массивов, все значения из $a, которые есть в $b.
теперь нам нужно самое первое значение из этого массива. Один из вариантов - это array_values()[0]
если нет совпадений, то при обращении к нулевому элементу будет ошибка, для её подавления используем сокращенный оператор проверки на существование, и присваиваем значение null
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для фильтрации по строковому значению в PHP можно использовать различные методы в зависимости от конкретной задачи. Ниже приведены некоторые из них:
1. Использование функции strpos():
Функция strpos() возвращает позицию первого вхождения подстроки в строку. Например, чтобы проверить, содержит ли строка $haystack подстроку $needle, можно использовать следующий код:
$haystack = "Hello, world!"; $needle = "world"; if(strpos($haystack, $needle) !== false) { echo "Строка содержит подстроку"; } else { echo "Строка не содержит подстроку"; }
2. Использование функции strstr():
Функция strstr() возвращает подстроку, начиная с первого вхождения и до конца строки. Например, чтобы получить подстроку, содержащую все символы после первого вхождения подстроки $needle, можно использовать следующий код:
$haystack = "Hello, world!"; $needle = "world"; $substring = strstr($haystack, $needle); echo $substring;
3. Использование регулярных выражений:
Регулярные выражения позволяют более гибко задавать условия для поиска и фильтрации строк. Например, чтобы найти все вхождения подстроки $needle в строке $haystack, можно использовать следующий код:
$haystack = "Hello, world!"; $needle = "o"; if(preg_match_all("/$needle/", $haystack, $matches)) { foreach($matches[0] as $match) { echo $match . " "; } }
Это лишь небольшой набор методов для фильтрации по строковому значению в PHP. В зависимости от требований и конкретной задачи можно выбрать наиболее подходящий способ реализации фильтрации.