PHP: возвращает длину каждого элемента массива или остановки

учитывая, что у меня есть массив, скажем:

$myArray=['12','AB','3C']

Я хочу вернуть значение 2 (которое является длиной каждого элемента массива по отдельности.)

Но в случае, если у меня есть что-то вроде

$myArray=['12','AB2','3C']

я бы хотел остановить расчет / цикл сразу после второго элемента из массива 'AB2' и пусть моя функция возвращает ноль.

Каков наиболее эффективный способ достичь этого в плане эффективности и скорости? Так как такой массив может стать длинным.

2

Решение

Случайный путь

Я думаю, что вы пытаетесь остановить цикл массива в тот момент, когда вы получаете две разные длины в элементе?

В этом случае, в худшем случае, вам понадобится O(n) время выполнения (поскольку вам нужно проверять каждый элемент, если только вы не имеете в виду абстрактный тип данных, в этом случае это может быть O(1), если он хранится в свойстве объекта или вы вычисляете разницу, обнаруженную на лету, когда помещаете элементы в массивы)

Поскольку в тот момент, когда мы обнаруживаем, что элемент не имеет одинаковую длину, мы можем просто быстро сохранить длину первого элемента в массиве, поскольку мы знаем, что если мы обнаружим любую другую длину, отличную от той, которую мы сохранили, мы можем немедленно вернуть null

function linear_loop($array) {
$len_of_first = strlen($array[0]);
foreach ($array as $val) {
if (strlen($val) != $len_of_first) {
return null;
}
}
//Function still running, entire array was same, return the length of first element
return $len_of_first;
}

Эта функция O(n) с каждой операцией постоянно. strlen является O(1)

Алгоритмическая сложность PHP-функции strlen ()

Самый быстрый и быстрый

Так как вы сказали, что массив может быть довольно длинным, если вы не сразу генерируете массив, а скорее вам нужно помещать в него элементы, то при выполнении операции push вы можете проверить перед тем, как нажать на нее. item_to_be_pushed та же strlen или какое-либо свойство, которое вы пытаетесь сравнить с тем, которое вы сохранили (которое может быть выбрано произвольно, так как массив должен быть property)

В этом случае вы могли бы иметь некоторые object с property: uniform_length и сохранить это. Тогда всякий раз, когда вы push в ваш массив, вы можете проверить это с помощью uniform_length, Если длина не совпадает, вы можете сохранить в свойстве объекта uniform как ложь (По умолчанию uniform верно, так как если в массиве только один элемент, он должен быть равномерным).

Это было бы O(1) расчет, так как он хранится как атрибут. Но вам, вероятно, не нужен объект для чего-то столь же простого, как этот, и вы можете просто сохранить его как некоторую переменную.

O (1) vs O (n) Runtime и почему он более эффективен

Поскольку не все знают Big O, быстрое объяснение того, что я сказал. O(1) время выполнения «бесконечно» лучше, чем O(n) время выполнения, так как время выполнения функции не будет расти вместе с вводом (поскольку при обработке 1 миллиона элементов требуется столько же шагов, сколько при обработке 1 элемента)

5

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

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

ех.

function isCorrect($arr) {
$len = strlen($arr[0]);
for($arr as $val) {
if(strlen($val) != $len) {
return false;
}
}
return true;
}
2

Просто мои два цента. Вы также можете использовать array_map за это:

$myArray = ['12','AB','3CC'];
$lengths = array_map('strlen', $myArray);
// output
Array
(
[0] => 2
[1] => 2
[2] => 3
)

Вы можете просто написать if заявление и проверьте max($lengths) и вернуться true or false

-ура

0