Foreach не работает правильно php in_array - PullRequest
0 голосов
/ 08 ноября 2019

Вам необходимо отобразить определенную часть массива. К сожалению, я не могу использовать in_array. Foreach не работает должным образом. Почему мой код отражает только последние элементы массива? Как извлечь определенную часть массива из массива?

У меня есть массив:

Array
(
    [$ id] => 1
    [items] => Array
        (
            [0] => Array
                (
                    [n] => 1
                    [Product] => MH OC52
                    [Item] => MH OC52
                    [Item2] => MH OC52
                    [isPic] => MH OC52
                    [Brand] => MAHLE
                    [Name] => Oil filter
                    [Found By] => MH OC52
                    [For Labels1] =>
                    [Price] => 136.82
                    [Retail] => 231.9
                    [codeDisc] => ES2
                    [Markup] => 0
                    [noReturn] => 0
                )

            [1] => Array
                (
                    [n] => 2
                    [Product] => CH C104.12
                    [Item] => CH C104.12
                    [Item2] => .......
                    
                )

            [2] => Array
                (
                    [n] => 2
                    [Product] => WX WL7074-12
                    [Item] => WX WL7074-12
                    ........
                   

Вот мой код:

if (is_array( $obj)) {
foreach($obj['items'] as $key=>$obRes){
 if ($ter = in_array("C104.12", $obRes))  {

    echo  ' tak' ;
} 
else {
    echo  "NOT Good";
}

}

var_dump ($key, $obRes['Price'],$obRes['Item'], $obRes['Bran'], $obRes['Name']);

1 tak tak tak tak tak tak tak tak tak tak tak takint (12)
float (56.03)
string (13) "WX WL7074-12"
string (5) "WIXFILTRON"
string (29) "Oil filter"

(
)

Прошу помощи

Мне нужно получить данные:



                    [Item] => CH C104.12
                    [Brand] => CHAMPION
                    [Name] => Oil filter           
                    [Price] => 35.69



1 Ответ

0 голосов
/ 08 ноября 2019

Что ж, когда вы пытаетесь найти значение в массиве массивов, вы можете использовать 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.;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...