Заполнение массива PHP: проверить на индекс сначала?

Посмотрите, хотите ли вы этого. Я изменил mainPic и content. Этот синтаксис containerStyle={{ paddingBottom: 0 }} не выглядит правильным, даже получает предупреждение в браузере. Возможно, вы хотите изменить style или classes={{root}} API CardActionArea.

mainPic: {
  width: 300,
  marginBottom: 0,
  padding: 0,
  borderRadius: '0 0 4px 4px',

},
content: {
  height: 225,
  padding: "0 !important",
  '&:last-child': {
    paddingBottom: "0 !important",
  },
}

enter image description here

5
задан Ben Dunlap 3 October 2008 в 21:15
поделиться

9 ответов

isset () очень быстр с обычными переменными, но у Вас есть массив здесь. Алгоритм карты хеша для массивов быстр, но это, все еще занимает больше времени, чем выполнение ничего.

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

Обратите внимание на то, что те две части кода не идентичны. Первая форма не установит значение для некоторого ключа, когда это уже установило - это предотвращает 'перезапись'.

3
ответ дан 18 December 2019 в 09:55
поделиться

Для массива Вы на самом деле хотите: array_key_exists($key, $array) вместо isset($array[$key]).

10
ответ дан 18 December 2019 в 09:55
поделиться

Вы имели размеры, как часто Вы сталкиваетесь с ситуацией это $array[$key] установлен, прежде чем Вы попытаетесь установить его? Я думаю, что нельзя дать общие рекомендации по этому, потому что, если существует на самом деле много тех случаев, проверка isset могла бы возможно сэкономить некоторое время путем предотвращения unnessecary наборов на массиве. Однако, если это просто редко имеет место, издержки могли бы замедлить Вас …. Лучшая вещь состояла бы в том, чтобы сделать сравнительный тест на Вашем фактическом коде.

Однако знайте, что оба кода могут привести к различным результатам! Если $val является не всегда тем же для a $array[$key] комбинация, бывший код всегда устанавливал бы значение к первому $val для этого $array[$key] где последний код всегда устанавливал бы его на последнее значение той комбинации.

(Я предполагаю, что Вы знаете об этом и $val всегда то же для $array[$key], но некоторый читатель, заходящий, не мог бы.)

2
ответ дан 18 December 2019 в 09:55
поделиться

Издержки сравнения, которое может или не может быть верным, кажутся, что должны занять больше времени.

Что делает запущение скрипта на обоих шоу конфигураций в течение времени производительности?

1
ответ дан 18 December 2019 в 09:55
поделиться

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

Если Вы собираетесь установить

$anArray[ 'level1' ][ 'level2' ][ 'level3' ] = ...

Необходимо удостовериться, что путь до level2 на самом деле существует до установки level3.

$anArray[ 'level1' ][ 'level2' ]

Никакие щенки не будут на самом деле уничтожены, если Вы не сделаете, но они могли бы раздражаться в зависимости от Вашей конкретной среды.

Вы не должны проверять индекс, который Вы на самом деле устанавливаете, потому что установка его автоматически означает, что он объявляется, но в интересах хорошей практики необходимо удостовериться, что ничто волшебно не создается.

Существует простой способ сделать это:

<?php

function create_array_path( $path, & $inArray )
{
    if ( ! is_array( $inArray ) )
    {
        throw new Exception( 'The second argument is not an array!' );
    }
    $traversed = array();
    $current = &$inArray;

    foreach( $path as $subpath )
    {
        $traversed[] = $subpath;
        if ( ! is_array( $current ) )
        {
            $current = array();
        }
        if ( ! array_key_exists( $subpath, $current ) )
        {
            $current[ $subpath ] = '';
        }
        $current = &$current[ $subpath ];
    }
}


$myArray = array();

create_array_path( array( 'level1', 'level2', 'level3' ), $myArray );

print_r( $myArray );

?>

Это произведет:

    Array
    (
        [level1] => Array
            (
                [level2] => Array
                    (
                        [level3] => 
                    )

            )

    )
1
ответ дан 18 December 2019 в 09:55
поделиться

Вам нужна фактическая проверка, чтобы видеть, там ли ключ? С присвоением на пробел выстраивают isset() просто замедлит цикл. И если Вы не делаете вторую передачу с манипулированием данными, я категорически не рекомендую проверку isset. Это - население, не управление.

0
ответ дан 18 December 2019 в 09:55
поделиться

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

0
ответ дан 18 December 2019 в 09:55
поделиться

Можно смотреть на исходный код PHP для наблюдения различия. Не проверял, будет ли это отличаться в более поздних версиях PHP, но это казалось бы в PHP3, функциональность ассоциативного массива находится в php3/php3_hash.c.

В функции _php3_hash_exists, сделаны следующие вещи:

  • ключ хешируется
  • корректный блок найден
  • обойденный блок, до корректного найденного объекта или нет

Функция _php3_hash_add_or_update:

  • хешированный
  • блок найден
  • обойденный, существующий переопределенный, если существуется
    • если не существовал, новый добавленный

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

0
ответ дан 18 December 2019 в 09:55
поделиться

я - новичок к PHP, но комбинация обоих могла быть с тернарным оператором

$array[$key] = !isset($array[$key]) ? $val : $array[$key];

это - один способ пойти с ним.

0
ответ дан 18 December 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: