nastya97core
@nastya97core
Начинающий программист

Как можно проверить, есть ли такие значения в многомерном массиве, когда второе значение тоже многомерное?

Здравствуйте. Возможно насовсем по-русски назвала вопрос, но суть такая:
есть массив:
(
    [0] => Array
        (
            [name_item] => Potato
            [size_item] => Array
                (
                    [0] => small
                    [1] => medium
                )
        )

    [1] => Array
        (
            [name_item] => Apple
            [size_item] => Array
                (
                    [0] => small
                    [1] => medium
                    [2] => big
                )
        )

    [2] => Array
        (
            [name_item] => Orange
            [size_item] => 
        )
)

Мне нужно узнать, могут ли существовать такие значения: ["Apple","small"] или ["Orange", null];

Я сделала так:
foreach ($items["entries"] as $item) {
	if ($item["name_item"] === $postData[0]) {
		if (is_array($item["size_item"])) {
			foreach ($item["size_item"] as $sizes) {
				if ($sizes === $postData[1]) $searchRes = true;
			}
		} else {
			if($item["size_item"] === $postData[1]) $searchRes = true;
		}
	} 
}


Оно работает, но оно меня пугает, потому что выглядит оно как костыль. Также, как видите, там есть фигня с проверкой на массив. У каких-то элементов может не быть вообще размеров, поэтому foreach работать не будет.

Скажите, это единственный способ решения, или можно было сделать это проще? Под "проще" я подразумеваю также "эффективнее".
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ответы на вопрос 2
Spartak-2205
@Spartak-2205
Разработка и создание сайтов
$arr_new = array_column($arr, "size_item", "name_item");
$postData = ["Apple","small"];

$searchRes = isset($arr_new[$postData[0]]) ? (is_array($arr_new[$postData[0]]) ? array_search($postData[1], $arr_new[$postData[0]]) !== false : $arr_new[$postData[0]] === $postData[1]) : false;
Ответ написан
Комментировать
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
Можно немного упростить, избавившись от вложенного цикла:
foreach ($items["entries"] as $item) {
  if ($item["name_item"] === $postData[0]) {
	  $searchRes = (
		  is_array($item["size_item"]) and
		  in_array($postData[1], $item["size_item"])
	) or
    $item["size_item"] === $postData[1];
  } 
}


PHP code online

$filtered = array_filter(
	$items["entries"],
	function($item) use ($postData) {
		return 
			$item["name_item"] === $postData[0] and 
			(
				(
					  is_array($item["size_item"]) and
					  in_array($postData[1], $item["size_item"])
				) or
				$item["size_item"] === $postData[1]
			);
	}
);


run PHP code online
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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