PHP & amp; Array: подсчитать расстояние между двумя клавишами

Имея массив, аналогичный приведенному ниже:

$steps = array(0 => 'aaa', 1 => 'bbb', 2 => 'ccc', ......, 7 => 'hhh', 8 => 'iii', .....);

Как я могу рассчитать, сколько шагов (ключ) мне нужно для достижения ключа 2 из ключа 7 с учетом последовательности?

0

Решение

Если у вас есть цифровые клавиши, в которых нет пропущенных чисел, вы можете использовать основное вычитание.

Если вам необходимо учесть возможные пропущенные номера или клавиши не являются числовыми, вы можете использовать комбинацию array_keys() а также array_search():

$array = array(
0 => 'aaa',
1 => 'bbb',
3 => 'ccc',
'four' => 'ddd',
900 => 'eee',
13 => 'fff'
);

$from = 1;
$to = 900;

$keys = array_keys($array);

$from_index = array_search($from, $keys); // 1
$to_index = array_search($to, $keys); // 4

$steps = $to_index - $from_index;
// 3 steps: from 1-3, from 3-'four' and from 'four'-900
2

Другие решения

Я решил эту проблему, написав этот код:

$tot_step = 0;

$steps = array(
0 => 'aaa',
1 => 'bbb',
2 => 'ccc',
3 => 'ddd',
4 => 'eee',
5 => 'fff',
6 => 'ggg',
7 => 'hhh',
8 => 'iii',
9 => 'jjj',
10 => 'aaa'
);

$from = "ddd";
$to = "bbb";

$from_index = array_search($from, $steps);
$to_index = array_search($to, $steps);

$last = $steps[(count($steps)-1)];

if ($from_index > 0) {

if ($to == $last)
$to_index = (count($steps)-1);

$arr_l = count($steps);
$mila = array();

for ($ind = $from_index; $ind <= ($arr_l-1); $ind++) {

if ($to == $last) {

if ($steps[$ind] != $last)
$mila[] = $steps[$ind];

} else {

$mila[] = $steps[$ind];

}

unset($steps[$ind]);

}

if (!empty($mila)) {

for ($i = (count($mila)-1); $i >= 0; $i--)
array_unshift($steps, $mila[$i]);

}

$to_new = array_search($to, $steps);

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

if ($key == $to_new)
break;
else
$tot_step++;

}} elseif ($from_index == 0) {

if ($to_index == $from_index) {

$tot_step = (count($steps)-1);

} else {

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

if ($key == $to_index)
break;
else
$tot_step++;

}

}

}

echo $tot_step;

Надеюсь это кому-нибудь пригодится

0

По вопросам рекламы [email protected]