Как отфильтровать объекты в массиве по значениям?

180
16 июля 2018, 16:50

Есть массив объектов у которых есть параметры: pay и cart, которые имеют значение 1 или 0. Я принимаю GET параметры pay и cart со значениями:

if(isset($_GET['pay'])) {
    $pay_get = $_GET['pay'];
} else {
    $pay_get = false;
}
if(isset($_GET['cart'])) {
    $cart_get = $_GET['cart'];
} else {
    $cart_get = false;
}

И пытаюсь отфильтровать массив по этим значениям:

foreach ($arr => $item) {
    //Фильтр по выкупу
        if($pay_get != false && $pay_get != $item->pay) {
            continue;
        }
        //Фильтр по карте
        if($cart_get != false && $cart_get != $item->cart) {
            continue;
        }
        $object = new stdClass;
        $object->name = $item->name;
        $object->properties->pay = $item->pay;
        $object->properties->cart = $item->cart;
        array_push($new_filtered_array, $object);
    }

Но что то не выходит корректно отфильтровать, мозги что то уже отказываются понимать почему. Как тут быть?

Answer 1
<?php
$GET = [
    'pay' => 0,
    'card' => 1,
    'test' => false,
];
$arr = [
    0 => (object)['pay' => 1],
    1 => (object)['card' => 1],
    2 => (object)['pay' => 0],
    3 => (object)['card' => 0],
    4 => (object)['card' => 0, 'pay' => 1],
    5 => (object)['card' => 1, 'pay' => 1],
    6 => (object)['card' => 0, 'pay' => 0],
    7 => (object)['card' => 1, 'pay' => 0],
];
$allowedFilter = [
    'pay',
    'card',
];
$allowedValues = [0, 1];
foreach ($arr as $index => $item) {
    $allFilter = true;
    foreach ($allowedFilter as $key) {
        if (!isset($GET[$key]) || !in_array($GET[$key], $allowedValues)) {
            //Нет фильтра, либо значение неправильно. Игнорируем фильтр
            continue;
        }
        if (empty($GET[$key]) && empty($item->$key)) {
            //Фильтр неактивный, значение тоже должно быть неактивно, для принятия
        } elseif (!empty($GET[$key]) && !empty($item->$key)) {
            //Фильтр активный, значение тоже должно быть активно, для принятия
        } else {
            //Фильтр отличается от значения, охрана отмена =)
            $allFilter &= false;
        }
    }
    if ($allFilter) {
        echo "Все фильтры совпали в позиции #{$index}\n";
    }
}

https://ideone.com/Q5fi1L

READ ALSO
Нужно ли прятать абсолютные пути к файлам в php?

Нужно ли прятать абсолютные пути к файлам в php?

Обычно различного рода экзепшенами стараются закрыть внутренние ошибкиПриведу примитивный пример, чтобы понятнее была суть вопроса

173
Не валидный JSON, PHP

Не валидный JSON, PHP

Получаю вот такой JSON:

172
Логика работы с приложениями facebook

Логика работы с приложениями facebook

Настраиваю приложение которое будет получать посты со стены публичной страницы и постить на сайте, столкнулся с некоторыми непонятностями,...

179