Как выбрать массив в связанном массиве по основному значению

У меня есть массив $arrItems['items'], в котором еще 5 массивов (связанный массив) и каждый массив содержит 5 элементов (with the keys: f_name, l_name, contact, address, seller_id).

Я хочу получить все эти массивы (из $arrItems['items']), в которых элемент продавца_id равен 1, как "seller_id"=>"1,2,3" ИЛИ "seller_id"=>"3,2,1" ИЛИ "seller_id"=>"4,6,2" ИЛИ "seller_id"=>"5,3,4" ИЛИ "seller_id"=>"2,1,2" Массив, указанный ниже.

array(5)
{
  [0] =>
    array(5)
    {
      ["f_name"] =>
        string(3) "abc"
      ["l_name"] =>
        string(3) "xyz"
      ["contact"] =>
        string(5) "12345"
      ["address"] =>
        string(3) "xyz"
      ["seller_id"] =>
        string(1) => "1,2,3"
    }
  [1]=>
    array(5) {
      ["f_name"]=>
        string(3) "abc"
      ["l_name"]=>
        string(3) "xyz"
      ["contact"]=>
        string(5) "12345"
      ["address"]=>
        string(3) "xyz"
      ["seller_id"]=>
        string(1)=>"3,2,1"
}
[2]=>
  array(5) {
    ["f_name"]=>
      string(3) "abc"
    ["l_name"]=>
      string(3) "xyz"
    ["contact"]=>
      string(5) "12345"
    ["address"]=>
      string(3) "xyz"
    ["seller_id"]=>
      string(1)=>"4,6,2"
}
[3]=>
  array(5) {
    ["f_name"]=>
      string(3) "abc"
    ["l_name"]=>
      string(3) "xyz"
    ["contact"]=>
      string(5) "12345"
    ["address"]=>
      string(3) "xyz"
    ["seller_id"]=>
      string(1)=>"5,3,4"
}
  [4]=>
  array(5) {
    ["f_name"]=>
      string(3) "abc"
    ["l_name"]=>
      string(3) "xyz"
    ["contact"]=>
      string(5) "12345"
    ["address"]=>
      string(3) "xyz"
    ["seller_id"]=>
      string(1)=>"2,1,2"
}

Пожалуйста, помогите мне на самом деле заказать таблицу, я хочу просто выбрать тот массив, в котором текущий идентификатор продавца равен 1. например seller No # 1 это логин. тогда все эти выборки массивов означают, что эти массивы сохраняются в другом массиве.

Эти данные поступают из таблицы базы данных? Если это так, вам нужно нормализовать структуру данных, чтобы предотвратить головную боль в будущем. stackoverflow.com/q/30702547/2943403

mickmackusa 25.02.2019 12:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
100
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Используйте array_filter()

$array = array_filter($arrItems['items'], function ($item) {
      $ids = explode(',', $item['seller_id']);
      return in_array(1, $ids);
});

Ваша попытка strpos также находит идентификаторы, содержащие 1, например f.e. 10 ('seller_id' => '2,10,3'). Так что этого мало, к сожалению :)

Wulf 25.02.2019 11:58

Ответы, содержащие только код, не имеют большого значения для Stackoverflow, потому что они мало что делают для обучения/расширения возможностей тысяч будущих исследователей.

mickmackusa 25.02.2019 12:10
Ответ принят как подходящий

array_filter (документация) с in_array (документация):

$sellerId = "1";
$arr = array_filter($arrItems['items'], function($e) use ($sellerId) {
    return in_array($sellerId, explode(",", $e["seller_id"]); 
});

Если вы хотите использовать только эти 5 вариантов:

$options = array("1,2,3", "3,2,1", "5,3,4", "4,6,2", "2,1,2");
$arr = array_filter($arrItems['items'], function($e) use ($options ) {
    return in_array($e["seller_id"], $options); 
});

Отредактировано: Что касается вашего запроса, это версия того же кода с использованием цикла foreach:

$sellerId = "1";
$seller_order_arr = []; 

foreach ($arrItems['items'] as $row) { 
    if (in_array($sellerId, explode(",", $row["seller_id"])))
        $seller_order_arr[] = $row;
} 

Теперь $seller_order_arr будет хранить ваш отфильтрованный массив

Виндер? это решение идеально подходит для извлечения массива. Но в моем проекте это создает проблему. данные извлеченного массива не установлены с помощью Grid. Можете ли вы извлечь массив, используя цикл foreach?

HaFiz Umer 25.02.2019 17:29

Любой код с использованием array_filter можно переписать с помощью for-loop Сейчас нет рядом компьютера - могу сделать это завтра

dWinder 25.02.2019 17:51

Виндер! все в порядке, я буду ждать тебя завтра. Потому что я пытаюсь переписать код, но он возвращает те массивы, в которых существует продавец_ид 1, но также возвращаются еще несколько массивов. мой код `$seller_order_arr = []; foreach ($arrItems['items'] as $row) { if (strpos($row['current_seller_id'] ,",") > 1 && $row['current_seller_id'] != null){ $seller_order_arr[] = $строка; } if ($row['current_seller_id'] == $currentUser){ $seller_order_arr[] = $row; } } $arrItems['items'] = $seller_order_arr;` Спасибо

HaFiz Umer 25.02.2019 17:55

@HaFizUmer Добавлена ​​версия кода с циклом foreach

dWinder 26.02.2019 08:22

Я переписываю код array_filter в foreach. Проверьте $seller_order_arr = []; foreach ($arrItems['items'] as $row) { if ($row['current_seller_id'] != null){ if (in_array($currentUser, explode(",", $row['current_seller_id']))){ $seller_order_arr[] = $row; } } } $arrItems['items'] = $seller_order_arr; Большое спасибо @dWinder за помощь и быстрый ответ.

HaFiz Umer 26.02.2019 08:33

Если я правильно понимаю, ваше значение seller_id представляет собой объединенную строку идентификаторов. Вы можете отфильтровать свой внешний массив с помощью array_filter и пользовательской функции обратного вызова, которая должна возвращать true, если элемент следует сохранить.

$idToLookup = 1;
$filteredItems = array_filter($arrItems['items'], function($element) {
    return preg_match('/(^|,)' . $idToLookup . '($|,)/', $element['seller_id']);
]);

Или, если вы не так хорошо знакомы с регулярным выражением, сначала разбейте числовую строку на отдельные числа, а затем используйте in_array:

$idToLookup = 1;
$filteredItems = array_filter($arrItems['items'], function($element) {
    $sellerIds = explode(',', $element['seller_id']);
    return in_array($idToLookup, $sellerIds);
]);

Другие вопросы по теме