Intereting Posts
Ссылка на новую страницу php page wordpress PHP-эквивалент объектов ASP.NET Application / Cache Prestashop – изменить статус заказа при подтверждении платежа glob php – возвращает все типы изображений из каталога Как расширить многоугольник на определенное расстояние в PHP / Mysql? Дополнительный параметр маршрутизации Laravel Использовать агрегированный метод с новыми классами драйверов MongoDB в PHP Можно ли опустить случайные параметры в вызов функции? WAMP: не удалось открыть поток: нет такого файла или каталога Получите широту и долготу всего местоположения, которые находятся в радиусе 10 км от моего текущего местоположения с помощью карты google (с использованием PHP) Как реализовать «Режим обслуживания» на уже созданном веб-сайте Отправка JSON jQuery Ajax на PHP и обратно Модель ATK4 не найдена при переходе в онлайн Сортировка столбца даты в CGridView с помощью CArrayDataProvider PHP. Каков хороший способ создать короткую буквенно-цифровую строку из длинного хэша md5?

Проверка того, содержит ли массив все элементы другого массива

Я разрабатываю приложение для электротехники. Тем не менее, я застрял в этом: у меня есть следующий массив

<?php // Static Array $GroupOfEight = array ( array(0,1,3,2,4,5,7,6), array(4,5,6,7,16,12,13,14), array(12,13,15,14,8,9,11,10), array(2,6,14,10,3,7,15,11), array(1,3,5,7,13,15,9,11), array(0,4,12,8,1,5,13,9), array(0,1,3,2,8,9,11,10) ); ?> 

И у меня есть еще один массив, но он один размер.

 <?php $myStack = array(0,1,3,2,4,5,7,6); //Dynamic, gets value by POST method. ?> 

То, что я хочу сделать, это проверить, равен ли $ myStack любой подвальный массив массива $ GroupOfEight. (Нумерация номеров не важна. Сценарий должен просто проверить, содержатся ли все элементы. Не важно, является ли их порядок одинаковым или нет.)

Вот что я сделал для решения проблемы до сих пор:

 <?php //Check if stackArray contains 8group for($i=0; $i<count($GroupOfEight);$i++) for($j=0; $j<count($GroupOfEight[$i]); $j++){ //$containsSearch = count(array_intersect($search_this,$all)) == count($search_this); $containsSearch = count(array_intersect($stackArray,$GroupOfEight[$j])) == count($stackArray); echo $containsSearch; } ?> 

Пожалуйста, помогите мне исправить мой код или представить мне решение этой проблемы, спасибо.

EDIT: он должен указывать только 1 номер индекса. например, stackArray равен 0,1,3,2,4,1,2,3, и он должен найти GroupOfEight [N], который соответствует тем же номерам, независимо от порядка чисел. Я должен получить N, если есть соответствующий случай.

Related of "Проверка того, содержит ли массив все элементы другого массива"

Учитывая ваши образцы массивов, вывод этого будет:

 > 0 

Если у вас есть только один вывод номера, это должно сделать следующее:

 <?php //Check if stackArray contains 8group $check=false; for($i=0; $i<count($GroupOfEight);$i++){ //$containsSearch = count(array_intersect($search_this,$all)) == count($search_this); $containsSearch = (count(array_intersect($stackArray,$GroupOfEight[$i])) == count($stackArray) && count(array_intersect($stackArray,$GroupOfEight[$i])) == count($GroupOfEight[$i])); if($containsSearch && !$check){ echo $i; //This specifies which index in GroupOfEight contains a matching array $check=true; } } ?> 

EDIT: Создал функцию. Возвращает первый согласованный индекс или -1 для совпадений:

 function searcheight($stackArray,$GroupOfEight){ for($i=0; $i<count($GroupOfEight);$i++){ $containsSearch = (count(array_intersect($stackArray,$GroupOfEight[$i])) == count($stackArray) && count(array_intersect($stackArray,$GroupOfEight[$i])) == count($GroupOfEight[$i])); if($containsSearch){ return $i; //This specifies which index in GroupOfEight contains a matching array } } return -1; } echo searcheight($stackArray,$GroupOfEight); 

Можешь попробовать :

 $searchKeys = array(); foreach ( $GroupOfEight as $key => $values ) { (count(array_intersect($values, $myStack)) == count($myStack)) and $searchKeys[] = $key; } #Output all keys it found same match var_dump($searchKeys); #OR Output Each Array it found a match foreach($searchKeys as $key) { var_dump($GroupOfEight[$key]); } 

То, что неправильно с вашим оригинальным подходом, состоит в том, что вы дважды перебираете GroupOfEight. У вас есть два for-loops.
Сначала вы выбираете каждый массив в GroupOfEight, а во втором цикле вы просматриваете каждое значение массива.

Если вы хотите использовать свой оригинальный подход, избавитесь от дополнительного цикла:

 echo "Hello, World!"; $GroupOfEight = array ( array(0,1,3,2,4,5,7,6), array(4,5,6,7,16,12,13,14), array(12,13,15,14,8,9,11,10), array(2,6,14,10,3,7,15,11), array(1,3,5,7,13,15,9,11), array(0,4,12,8,1,5,13,9), array(0,1,3,2,8,9,11,10) ); $myStack = array(0,1,3,2,4,5,7,6); //Dynamic, gets value by POST method. for($i=0; $i<count($GroupOfEight);$i++) { $containsSearch = count(array_intersect($myStack,$GroupOfEight[$i])) == count($myStack); if($containsSearch===true) { echo "Woo! GroupOfEight[$i], <br/>" . print_r($GroupOfEight[$i], true) . "<br/>==<br/>" . print_r($myStack, true); } } 

Демо: http://codepad.viper-7.com/0hRNHz

Вы можете сделать то же самое с array_diff :

 for($i=0; $i<count($GroupOfEight);$i++) { if(count(array_diff($myStack,$GroupOfEight[$i]))==0) { echo "Woo! GroupOfEight[$i], <br/>" . print_r($GroupOfEight[$i], true) . "<br/>==<br/>" . print_r($myStack, true); } } 

Демо: http://codepad.viper-7.com/6uLd9L

Обновить
Связанная запись SO: Проверьте, равны ли два значения массива (игнорируя порядок)

Вы сравниваете count которого недостаточно, поскольку числа могут быть изменены. Попробуй это:

 // Static Array $GroupOfEight = array ( array(0,1,3,2,4,5,7,6), array(4,5,6,7,16,12,13,14), array(12,13,15,14,8,9,11,10), array(2,6,14,10,3,7,15,11), array(1,3,5,7,13,15,9,11), array(0,4,12,8,1,5,13,9), array(0,1,3,2,8,9,11,10) ); $myStack = array(0,1,3,2,4,5,7,6); //Dynamic, gets value by POST method. $containsSearch = false; foreach($GroupOfEight as $key => $value){ if ($myStack == $value) { $containsSearch = true; } } var_dump($containsSearch); 

Подсчитайте общее количество $ GroupOfEight [$ i]
Подсчитайте общее количество $ myStack
если итоговые значения равны:
В цикле –
если $ myStack [$ c] – in_array ($ GroupOfEight [$ i]): $ equal = 1
else $ equal = 0; Выход;

если $ равные == 1 -> массивы одинаковы

Нам не нужны никакие петли. Попробуй это

 <?php $GroupOfEight = array ( array(0,1,3,2,4,5,7,6), array(4,5,6,7,16,12,13,14), array(12,13,15,14,8,9,11,10), array(2,6,14,10,3,7,15,11), array(1,3,5,7,13,15,9,11), array(0,4,12,8,1,5,13,9), array(0,1,3,2,8,9,11,10) ); $myStack = array(0,1,3,2,4,5,7,6); $key = ''; $key = array_search($myStack,$GroupOfEight); echo $key; ?> 

Вывод

0

Примечание. Выходной $key – это местоположение массива в $ GroupOfEight, то есть ($ GroupOfEight [0]).