Как проверить порядок массива

129
30 января 2021, 14:20

Есть массив

$order = [1,2,3];

Это главный массив, по нему нужно сделать проверку порядка другого массива.

И массив в котором нужно проверить порядок

$test = [
  0 => [
    'id' => 1
  ],
  1 => [
    'id' => 3
  ],
];

Получается нужно узнать, идут ли id второго массива по порядку первого массива

Если порядок первого массива 1,2,3, а второго 1,3 - То это правильный порядок

Если порядок первого массива 1,2,3, а второго 2,3 - То это правильный порядок

Если порядок первого массива 1,2,3, а второго 1,2,3 - То это правильный порядок

Если порядок первого массива 1,2,3, а второго 3,2 - То это не правильный порядок

С чего начать?

Answer 1
$check = function($data) use ($order){
            foreach($data as $v){
                $p = array_search($v, $order);
                if($p === false) return false;
                $order = array_slice($order, $p);
            }
            return true;
         };

можно как-то так искать, хотя хочется поизящнее (например как-то с array_shift($oder)). Берете элемент data, ищите его в order, если нашлось, обрезаете order до этой найденной позиции, и идете дальше. А если не нашлось,то не соответствует.

дополнено:
что-то вроде такого (тело предыдущей функции), но что-то я не уверен, что оно работает корректно.

 foreach($data as $v){
     while( $order && $v != ($o = array_shift($order)));
     if( $v !== $o ) return false;
 }
 return true;
Answer 2
<?php
function f($a, $b) {
    $n = 0;
    $a_count = count($a);
    for ($i = 0, $k = count($b); $i < $k; $i++) {
        while($n <= $a_count){
            if ($b[$i]['id'] == $a[$n]) {
                break;
            }else{
                if($n == $a_count){
                    return false;
                }
                $n++;
            }
        }
    }
    return true;
}

$order = [1,2,3];
$test = [
  0 => [
    'id' => 1
  ],
  1 => [
    'id' => 3
  ],
];
$test2 = [
  0 => [
    'id' => 3
  ],
  1 => [
    'id' => 2
  ],
];
$test3 = [
  0 => [
    'id' => 1
  ],
  1 => [
    'id' => 2
  ],
];
$test4 = [
  0 => [
    'id' => 2
  ],
  1 => [
    'id' => 3
  ],
];
$test5 = [
  0 => [
    'id' => 3
  ],
  1 => [
    'id' => 1
  ],
];
$test6 = [
  0 => [
    'id' => 2
  ],
  1 => [
    'id' => 1
  ],
];

echo '1(13)['.f($order, $test).']<br/>'.
'2(32)['.f($order, $test2).']<br/>'.
'3(12)['.f($order, $test3).']<br/>'.
'4(23)['.f($order, $test4).']<br/>'.
'5(31)['.f($order, $test5).']<br/>'.
'6(21)['.f($order, $test6).']<br/>';

Выведет: 1(13)[1] 2(32)[] 3(12)[1] 4(23)[1] 5(31)[] 6(21)[]

READ ALSO
Как получить список ошибок формы в нормальном виде?

Как получить список ошибок формы в нормальном виде?

Использую в контроллере форму унаследованную от Symfony\Component\Form\AbstractTypeХочу как-то получить список ошибок валидации

110
Проверка тип данных &lt;PHP&gt;

Проверка тип данных <PHP>

У меня на PHP приходят данные, и я пока не знаю какиеЗадача понять число ли это или нет

94
Что не так с регуляркой

Что не так с регуляркой

Не работает регурялка в php может кто-то подскажет почему?:

117