Проверка кода PhpStorm возвращает «Недопустимый тип ключа массива с плавающей точкой» - PullRequest
0 голосов
/ 27 октября 2018

В PhpStorm я получаю предупреждение о недопустимом типе ключа массива, но не могу понять, что недопустимо в $size[$factor].

Недопустимый тип ключа массива с плавающей точкой

Это мой код:

    $size       = array(' kB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB');
    $factor     = round((strlen($kbytes) - 1) / 3);
    $sizereturn = sprintf("%.{$decimals}f", $kbytes / pow(1024, $factor)) . @$size[$factor];
    $sizereturn = str_replace('.', ',', $sizereturn);

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Массив $size - это простой массив, который имеет 0, 1, 2...,7 целочисленные индексы, а тот, который вы назначаете, является плавающей точкой.Используйте приведение типов, чтобы сначала преобразовать его в integer, а затем использовать.

0 голосов
/ 02 ноября 2018

Для полноты картины стоит отметить, что это просто функция PhpStorm, предупреждающая о потенциальных ошибках. Сам PHP, будучи свободно типизированным языком, не жалуется и не заботится о типах ключей массива , пока они скаляры , и просто приведёт к правильному типу:

var_dump([
    2.0 => 'Red',
    3.1 => 'Green',
    'Kittens' => 'Blue',
]);

class Foo
{
    public function __toString()
    {
        return 'bar';
    }
}
var_dump([
    (string)new Foo() => 'This is valid too',
]);

var_dump([
    new Foo()      => 'Invalid key', // Warning: Illegal offset type
    range(1, 2)    => 'Invalid key', // Warning: Illegal offset type
    new Datetime() => 'Invalid key', // Warning: Illegal offset type
]);
array(3) {
  [2]=>
  string(3) "Red"
  [3]=>
  string(5) "Green"
  ["Kittens"]=>
  string(4) "Blue"
}
array(1) {
  ["bar"]=>
  string(17) "This is valid too"
}
array(0) {
}

Демо

0 голосов
/ 28 октября 2018

round() функция возвращает число с плавающей запятой.

Допустимые ключи для доступа к элементу массива должны быть целыми числами и строками.

Попробуйте сначала преобразовать его в int, например,

$factor     = (int)round((strlen($kbytes) - 1) / 3);
...