2016-10-02 2 views
0

У меня возникли проблемы с сравнением двух массивов с array_inersect(), попробовал много предложений от SO, но никто не работал. Так вот моя проблема:PHP Array проверяет количество одинаковых значений

У меня есть два массива:

$base_array = array(2,2,2,1); 

Array 
(
    [0] => 2 
    [1] => 2 
    [2] => 2 
    [3] => 1 
) 

И еще один $risks, который печатает так:

Array 
(
    [0] => 2 
    [1] => 3 
    [2] => 4 
    [3] => 1 
    [4] => 2 
    [5] => 8 
    [6] => 6 
) 

То, что я хочу, чтобы увидеть, если такое же количество и тип значений от $base_array вписывается в $risks массив. Сейчас она должна возвращать ложное, потому что я только два вхождений числа 2 и базовый массив имеет 3. Но если установить $base_array на:

$base_array = array(2,2,1); 

Это должно вернуться верно.

+1

Показать Ваш код. –

+0

Я не могу сделать код, чтобы дать мне то, что мне нужно, все, что я пробовал, было array_intersect и array_diff, но не сработало. Всегда возвращающее истинную причину 2 существует в обоих случаях, но не в одном случае. – rgomez

+0

Должен ли он возвращать true, когда в '$ base_array' есть два 2? мы проверяем, есть ли два 2 и один 1, правильно? –

ответ

1

Один подход может подсчитывать появление каждого числа, а затем вручную сравнивать их. Для этого вам нужно два массива, чтобы сохранить количество ошибок.

$base_array_count = []; 
$risks_count = []; 

В вашем случае $base_array_count будет выглядеть

$base_array_count[1] = 1 
$base_array_count[2] = 2 

И $risks_array_count будет выглядеть

$risks_count[1] = 1 
$risks_count[2] = 2 
$risks_count[3] = 1 
$risks_count[4] = 1 
$risks_count[6] = 1 
$risks_count[8] = 1 

Теперь петли через $base_array и проверить, если каждое число $base_array_count значение такое же, как и в $risks_array_count

Полный код после редактирования:

$base_array = array(1,2,2,7); 
$risks_array = array(2,3,4,5,6,7); 

$base_array_count = array(); 
$risks_array_count = []; 

for($i = 0; $i < sizeof($base_array); $i++){ 
    if(!isset($base_array_count[$base_array[$i]])) 
     $base_array_count[$base_array[$i]] = 0; 
    $base_array_count[$base_array[$i]]++; 
} 

for($i = 0; $i < sizeof($risks_array); $i++){ 
    if(!isset($risks_array_count[$risks_array[$i]])) 
     $risks_array_count[$risks_array[$i]] = 0; 
    $risks_array_count[$risks_array[$i]]++; 
} 

$same = true; 

if (sizeof($base_array) <= sizeof($risks_array)) { 
    for ($i = 0; $i < sizeof($base_array); $i++) { 
     if(!isset($risks_array_count[$base_array[$i]]) || $base_array_count[$base_array[$i]] != $risks_array_count[$base_array[$i]]){ 
      $same = false; 
      break; 
     } 
    } 
} else { 
    $same = false; 
} 
if($same) 
    echo "TRUE"; 
else 
    echo "FALSE"; 
+0

спасибо за ваше предложение, я попробовал с 'array_diff', но он работал не очень хорошо. Не могли бы вы объяснить, как мне зацикливаться на каждый '$ base_array_count' и сравнивать? – rgomez

+0

@rgomez Добавил полный код, проверьте, разрешает ли он вашу проблему. –

+0

почти идеальный и извините за то, что он такой дотошный, но это будет очень важно в моем коде. Он отлично работает даже с добавлением других чисел в base_array, например 8 или 4 ('$ base_array = array (1,2,2,4,8);') и, конечно, если я установил 2,2,2, он вернет false.Но проблема возникает, если я задаю, например, '$ base_array = array (1,2,2,7);' I get 'Undefined offset: 7' – rgomez

1

Это может быть сделано путем array_diff с некоторой дополнительной проверки. См. Здесь

$base_array = array(1,2,2,7); 
$risks_array = array(1,2,2,3,4,5,6); 

if(array_diff($base_array, $risks_array)) // false if $base_array has type of elemenes which $risk_array does not contain 
echo "false"; // 
else{ 
// $risk_array has all type of elements of $base_array. now check for similar frequency 
$freq_cnt_base = array_count_values($base_array); 
$freq_cnt_risks = array_count_values($risks_array); 
$is_similar = "true"; 

foreach($freq_cnt_base as $key => $val){ 
    if($freq_cnt_risks[$key] !== $freq_cnt_base[$key]){ 
     $is_similar = "false"; 
     break; 
    } 
} 
echo $is_similar; 
} 
Смежные вопросы