Есть ли способ сравнить значение по определенному индексу со всеми значениями справа, пока оно не совпадет? - PullRequest
0 голосов
/ 17 октября 2019

Допустим, у меня есть массив:

$ar = array(0,1,0,0,0,1,0)

Я хочу сравнить значение в $ar[2], то есть 0 со всеми значениями справа, пока не прекратится сопоставление. Этим. Я имел в виду, что $ar[2] == $ar[3], $ar[2] == $ar[4] и т. Д., Пока не будет найдено несоответствие, скажем, на $ar[12], т. Е. $ar[2] != $ar[12]. Так что это скажет мне, что $ar[2] равно всем значениям справа до $ar[12].

Теперь, как бы я это сделал в коде. Массив может быть любого размера.

Мой код был таким:

class JumpingClouds {
    public function jump() {
        $ar = array(0,1,0,0,0,1,0);
        for ($i=0; $i < count($ar) ; $i++) { 
            if ($ar[$i] == $ar[$i++]) {
                if($ar[$i++] == $ar[$i+2]) {
                    # code...
                }
            } else {
                # code...
            }
        }
    }
}

$j = new JumpingClouds();
$j->jump();

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

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Вы можете просто использовать цикл while для циклического перебора элементов после того, на который вы смотрите, и сравнения его со значением совпадения. while также проверяет конец массива.

Я передал массив в конструктор класса, так что метод upTo() может быть вызван с любым количеством значений натот же массив (не передавая его каждый раз).

Это вернет false, если часть from больше массива ...

$ar = array(0,1,0,0,0,1,0);
$from=2;

$scanner = new Scan($ar);

var_dump($scanner->upTo($from));

class Scan {
    private $values;

    public function __construct( array $values )    {
        $this->values = $values;
    }

    public function upTo( int $from )    {
        // Get number of elements in the array
        $size = count($this->values) - 1;
        // If start is past end of array, return false
        if ( $from > $size )    {
            return false;
        }
        // Store value to check against
        $match = $this->values[$from];
        // Loop, checking if the element looking at is the same and not the end of the array
        while ( $this->values[$from] == $match && $from < $size)  {
            // Move onto next element
            $from++;
        }
        // Return the position of the last element that matches
        return $from;
    }
}
1 голос
/ 17 октября 2019

Вам нужно использовать for цикл. Вы можете использовать ниже функцию. Возвращает index когда совпадение найдено, иначе возвращается -1

$ar = array(0,1,0,0,0,1,0); 
$from = 2; //Need to match from 2 index onwards

echo $index = jump( $ar, $from );     
//if -1 no match

function jump($ar, $from) {

    $count = count ( $ar );

    if( $from >= $count ) {
        return -1;
    }
    $compareValue = $ar[$from];
    for( $i = 0; $i < count( $ar); $i++ ) {
        if( $i <= $from ) {
            continue; //Index is below so continue
        }

        if( $ar[$i] != $compareValue ) {
           return $i + 1;   
        }   
    }

    return -1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...