Фильтрация по строковому значению?

Ссылка скопирована
PHP
1 марта 2026 1 ответ

Приветствую. Условно есть массив с описанием значений от "старшего" к "младшему"

["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

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Дмитрий К. Ответ

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

    1. Использование функции strpos():
    Функция strpos() возвращает позицию первого вхождения подстроки в строку. Например, чтобы проверить, содержит ли строка $haystack подстроку $needle, можно использовать следующий код:

    $haystack = "Hello, world!";
    $needle = "world";
    if(strpos($haystack, $needle) !== false) {
        echo "Строка содержит подстроку";
    } else {
        echo "Строка не содержит подстроку";
    }

    $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;

    $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 . " ";
        }
    }

    $haystack = "Hello, world!"; $needle = "o"; if(preg_match_all("/$needle/", $haystack, $matches)) { foreach($matches[0] as $match) { echo $match . " "; } }

    Это лишь небольшой набор методов для фильтрации по строковому значению в PHP. В зависимости от требований и конкретной задачи можно выбрать наиболее подходящий способ реализации фильтрации.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно