Я разрабатываю приложение для электротехники. Тем не менее, я застрял в этом: у меня есть следующий массив
<?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, если есть соответствующий случай.
Учитывая ваши образцы массивов, вывод этого будет:
> 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]).