2014-10-19 5 views
1

Я читал руководство, чтобы найти функцию, которая делает то, что я хочу, но в итоге я сделал это сам. Я хочу сравнить два массива и вычислить разницу между клавишами. Или более практически проанализировать разницу в порядке значений.сравнить два массива в PHP и получить разницу в ключе

Я сделал это следующим образом, но у меня есть чувство, что это можно сделать лучше.

Если у кого-то есть идея, как улучшить это, пожалуйста, дайте мне знать, потому что я хочу улучшить.

<?php 
$goodarray = array(300,250,200,150,100); 

$usersupliedarray = array(250,300,200,150,100); // first two spots are wrong 

$score = count($goodarray); 

foreach($usersupliedarray as $key => $value){ 

    $arraykey = array_search($value, $goodarray); 

    $difference = abs($key-$arraykey); 

    $score = $score + $difference; 


    echo "$value $goodarray[$key] ($difference = $score) <hr />"; 

} 
+1

Я предполагаю, что это ваша домашняя работа? –

+0

Это не к счастью. Спасибо за вашу неявную озабоченность ;-) – rinserepeat

ответ

1

array_map с может пригодиться здесь, например, недействительный обратным вызовом,

$a = array(300,250,200,150,100); 
$b = array(250,300,200,150,100); 

$faults = 0; 
foreach(array_map(null, $a, $b) as $x) 
    $faults += $x[0] != $x[1]; // x[0] is $a element, x[1] is $b 

print $faults; // 2 

UPD: если вы хотите, чтобы вычислить расстояния между одинаковыми элементами, а не только рассчитывать различия, ваш исходный код выглядит просто отлично для меня. Одним из улучшений, которые можно сделать, чтобы избавиться от неэффективных array_search и использовать «инвертированный индекс» первого массива вместо:

foreach($a as $pos => $val) 
    $inv[$val] = $pos; 

или просто

$inv = array_flip($a); 

, а затем

foreach($b as $pos => $val) 
    $score += abs($pos - $inv[$val]); 
+0

HI Georg, мне нужно будет более внимательно изучить ваш код;) Спасибо, я сообщу вам, как только полностью его пойму. – rinserepeat

+0

Ha Georg благодарит за показ мне array_map с обратным вызовом void, теперь я вижу, что он создает массив массивов. Тем не менее, им нужен способ оценить разницу в порядке значений. так что, если кто-то один шаг, это всего лишь 1, но если кто-то 3 шага, он «пейлинизирован» с 3. В любом случае ваш пример дал мне достаточно новой информации, чтобы сделать ваш пост полезным. Спасибо за это! +1 – rinserepeat

+1

@ rinserepeat: oops, похоже, я неправильно понял вопрос! Я обновил свой пост. – georg

Смежные вопросы