Что ж, когда вы пытаетесь найти значение в массиве массивов, вы можете использовать FilterIterator
класс php. Давайте посмотрим, как это можно сделать.
Мы предполагаем, что ваши внутренние массивы всегда имеют одинаковые ключи, как в следующем примере:
$data = [
[
'product' => 'Product A',
'brand' => 'Brand A',
'price' => 12.34,
],
[
'product' => 'Product B',
'brand' => 'Brand B',
'price' => 56.78,
],
[
'product' => 'Product C',
'brand' => 'Brand C',
'price' => 90.12,
],
];
Как вы можете видетьэтот массив массивов структурирован как ваш собственный массив. Например, это не то же самое. В конце концов, вы должны научиться решать вашу проблему. ;)
Итак, давайте посмотрим, как FilterIterator
может вам помочь. Сначала нам нужно указать фильтр, который фильтрует ваш массив по имени продукта.
class ProductFilterIterator extends \FilterIterator
{
protected $filter;
public function __construct(\Iterator $iterator, string $filter)
{
$this->filter = $filter;
parent::__construct($iterator);
}
public function accept() : bool
{
$current = $this->getInnerIterator()->current();
return $current['product'] == $this->filter;
}
}
Это довольно простой класс FilterIterator
, который берет данный фильтр и сравнивает его с ключом продукта одноговаших внутренних массивов вашей коллекции массивов. Метод accept
итератора фильтра возвращает true, когда в массиве найден указанный продукт «Продукт B». В противном случае возвращается false. Давайте в коротком примере поищем продукт с именем «Продукт B».
<code>$iterator = (new \ArrayObject($data))->getIterator();
$filter = new ProductFilterIterator($iterator, 'Product B');
foreach ($filter as $data) {
echo "<pre>";
var_dump($data);
echo "
";}
Результат этой отфильтрованной итерации:
array(3) {
["product"] => string(9) "Product B"
["brand"] => string(7) "Brand B"
["price"] => float(56.78)
}
Полагаю, в настоящее время это было бы наилучшим практическим решением для фильтрации многомерных массивов, подобных вашему. Инкапсулированная итерация, которую вы пробовали самостоятельно, может работать, но в большинстве случаев выглядит очень странно и сложно для рефакторинга. Проверка значенийв foreach в цикле foreach было сделано в прошлом. Вы должны применять более современные методы php. Это 2019.;)