Проверка, содержит ли массив все элементы другого массива
Я разрабатываю приложение для электротехники. Тем не менее, я застрял на этом: У меня есть следующий массив
<?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, если есть совпадающий случай.
6 ответов
учитывая ваши образцы массивов, выход этого будет:
> 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 два раза. У тебя две передние петли.
Сначала вы выбираете каждый массив в GroupOfEight, а во втором цикле for вы проходите через каждое значение массива.
Если вы хотите использовать свой оригинальный подход, избавьтесь от дополнительного цикла for:
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; exit;
Если $equal == 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 i.e ($GroupOfEight[0])