PHP получить размер данных массива - PullRequest
9 голосов
/ 26 января 2012

Имея этот массив:

Array
(
    [_block1] => Array
        (
            [list] => Array
            (
                 [sub-list] => Array
                 (
                 )
            )
            [links] => Number
            [total] => Number
            ...
        )
    [_block2] => Array
        (
             [@attributes] => Array
             (
             )
             [title] => ...
             [data] => Array ()
             ...
        )
    [_block3] => Array
        (
             ..
        )
)

Эти блоки содержат данные, возвращаемые API.Зная, что каждый API возвращает данные по-своему / структуре, мне нужно измерить / вычислить данные / размер внутри каждого из них, а затем выполнить if data > X или <сделать что-то. </p>

Возможно ли это?Я искал в Google, но нашел только count(), и это не то, что мне нужно, чтобы сделать эту работу.

Редактировать: Каждый из этих блоков содержит много других субблокови я думал о расчете размера данных в байтах, потому что count здесь не справится.

Ответы [ 4 ]

22 голосов
/ 10 ноября 2013
echo  mb_strlen(serialize((array)$arr), '8bit');
12 голосов
/ 26 января 2012

Если я правильно понял ваш вопрос, вам нужен размер каждого «блочного» подмассива внутри основного массива.

Вы можете сделать что-то вроде этого:

$sizes = array();
foreach($returnedArray as $key => $content) {
    $sizes[$key] = count($content);
}

$sizes массив будет ассоциативным массивом, в котором различные «блоки» будут использоваться как ключи, а размер данных - как значения.

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

function getSize($arr) {
    $tot = 0;
    foreach($arr as $a) {
        if (is_array($a)) {
            $tot += getSize($a);
        }
        if (is_string($a)) {
            $tot += strlen($a);
        }
        if (is_int($a)) {
            $tot += PHP_INT_SIZE;
        }
    }
    return $tot;
}

при условии, что в ней есть только строки в кодировке ASCII.

3 голосов
/ 05 августа 2014

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

$serialized = serialize($foo);
if (function_exists('mb_strlen')) {
    $size = mb_strlen($serialized, '8bit');
} else {
    $size = strlen($serialized);
}

Надеюсь, это будет полезно.

3 голосов
/ 26 января 2012

Вы имеете в виду что-то подобное?

$x = 32;
foreach($blocks as $key => $block)
{
  if(getArraySize($block) < $x)
  {
     //Do Something
  }else
  {
     //Do another thing
  }
}


//Recursive function
function getArraySize($array)
{
   $size = 0;
   foreach($array as $element)
   {
      if(is_array($element))
         $size += getArraySize($element);
      else
         $size += strlen($element);
   }

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