PHP: быстрее проверять, является ли переменная целочисленной или начинается с # - PullRequest
2 голосов
/ 25 ноября 2011

Я разрабатываю модуль с несколькими массивами в нем.Теперь мой массив содержит:

$omearray = array (
  '#title' = 'title',
  0 = array ( 'another array', '2ndvalue', ),
  );

foreach($omearray as $key => $value)

Когда я загружаю массив для отображения, я хочу проверить, является ли значение $key 0, 1, 2, 3 и т. Д.или значение $key, начинающееся с #.

Что было бы лучше использовать: проверка, является ли значение is_int() или регулярное выражение, проверяющее, является ли первый символ #?

РЕДАКТИРОВАТЬ: проверка строки 1 является # против is_int(), поскольку регулярное выражение кажется медленным.

Ответы [ 6 ]

3 голосов
/ 25 ноября 2011

Поскольку if ($key[0]=='#') быстрее и is_int() является исчерпывающим, а || является оператором короткого замыкания с левой ассоциативностью (оценивается слева направо, см. Пример 1 на http://php.net/manual/en/language.operators.logical.php) Я бы сказал:

if ($key[0]=='#' || is_int($val)) /* etc */

Поскольку таким образом вам нужно всего лишь беспокоиться об использовании соглашения о присвоении имен самому ключу # с ключами, которые вы сравните настолько, что выиграете от оптимизации.

Но если вы не сделаете огромное количество оценок, я бы остановился на if(is_int($val)), потому что это яснее и менее грязно.

2 голосов
/ 25 ноября 2011

Я бы проверил, используя if($key[0]=="#")

Вы также можете проверить, является ли значение $ массивом (is_array($value)), в этом случае вам не нужны ни регулярные выражения, ни is_int, ни # char.

PS: # символ означает (где-то) «Я номер / ID»

1 голос
/ 25 ноября 2011
if (is_int($val) || $val{0} == '#') ...
1 голос
/ 25 ноября 2011

Я бы пошел на is_int(), потому что вы не зависите от строки.Это может быть что угодно, и ваш код все равно будет принимать целочисленные значения.Поиск # в качестве первого символа предотвратит эту гибкость.Но если вы абсолютно уверены, что первый символ строки всегда будет #, то самый быстрый вариант будет $Key[0] == '#'.

0 голосов
/ 25 ноября 2011

Вы можете проверить, является ли строка целым числом
или начинается ли она с #
или с обоих
или чем-то еще.

Все это не имеет ни малейшего значения.

Это не часть вашего кода, которая может повлиять на любые проблемы с производительностью.

0 голосов
/ 25 ноября 2011

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

$omearray = array(
    '#title' => 'title',
    'foo' => array(
        'anotherarray',
        '2ndvalue'
    )
);

foreach ($omearray as $key => $value) {
    if ($key == 'foo') {
        // do something with $value, which is the 2nd array, numerically indexed
    }
}

Извините, если это решение не соответствует вашим потребностям.

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