okovalev
@okovalev

Как оставить в массиве элементы только соответвующие признаку?

Грубо говоря у меня в массиве есть некие признаки, по которым его нужно фильтровать. И я не могу понять, как мне по ним фильтровать массив.
Пример кода с массивом: pastie.org/p/6LMMUQZ19QNKRLBDkOXIIZ

Мне не нравится foreach, как-то мне кажется можно сделать подругому.
Спасибо

<?php

var_dump(getCourseBinance([
		'crypto' => 'usdt',
	    'fiat' => 'rub',
	    'trade' => 'buy',
		'payment' => 'Tinkoff',
		'reviews' => 10,
		'amount' => 30000
]));

function getCourseBinance($params = []) {
	
	$params = array_merge([
	    'crypto' => 'usdt',
	    'fiat' => 'rub',
	    'trade' => 'sell',
		'payment' => '',
		'reviews' => 10,
		'amount' => 30000
	], $params);
	
	$json = 'массив';
    $data = json_decode($json, true);
	
	foreach ($data as $key => $value) {
		if(!in_array($params["payment"], $value['payment_methods'])) {
			 unset($data[$key]);
		}
	}

	foreach ($data as $key => $value) {
		if($params["reviews"] > $value['reviews']) {
			 unset($data[$key]);
		}
	}

	foreach ($data as $key => $value) {
		if($params["amount"] > $value['seller_buyer_limit_max']) {
			unset($data[$key]);
		}
	}

	return $data;
	
	
}
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
usdglander
@usdglander Куратор тега PHP
Yipee-ki-yay
$data = json_decode($json, true);

$result = array_filter(
    $data,
    function ($value) use ($params) {
        if(isset($params["payment"]) && !in_array($params["payment"], $value['payment_methods'])) {
            return false;
        }

        if(isset($params["reviews"]) && $params["reviews"] > $value['reviews']) {
            return false;
        }

        if(isset($params["amount"]) && $params["amount"] > $value['seller_buyer_limit_max']) {
            return false;
        }

        //Код для остальных фильтров если надо

        return true;
    }
);


Анонимную функцию можно вынести в переменную или отдавать какой то другой функцией. Например:

function binanceFilterFn($params) {
    return function($value) use ($params) {
         if(isset($params["payment"]) && !in_array($params["payment"], $value['payment_methods'])) {
            return false;
        }
        //...
    }
}

$result = array_filter($data, binanceFilterFn($params));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы