У меня есть массив $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 это логин. тогда все эти выборки массивов означают, что эти массивы сохраняются в другом массиве.






Используйте 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'). Так что этого мало, к сожалению :)
Ответы, содержащие только код, не имеют большого значения для Stackoverflow, потому что они мало что делают для обучения/расширения возможностей тысяч будущих исследователей.
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?
Любой код с использованием array_filter можно переписать с помощью for-loop Сейчас нет рядом компьютера - могу сделать это завтра
Виндер! все в порядке, я буду ждать тебя завтра. Потому что я пытаюсь переписать код, но он возвращает те массивы, в которых существует продавец_ид 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;` Спасибо
@HaFizUmer Добавлена версия кода с циклом foreach
Я переписываю код 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 за помощь и быстрый ответ.
Если я правильно понимаю, ваше значение 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);
]);
Эти данные поступают из таблицы базы данных? Если это так, вам нужно нормализовать структуру данных, чтобы предотвратить головную боль в будущем. stackoverflow.com/q/30702547/2943403