【问题标题】:php get array's data sizephp 获取数组的数据大小
【发布时间】:2012-01-26 13:19:30
【问题描述】:

拥有这个数组:

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

有可能吗?我搜索了谷歌,但我只找到了count(),这不是我完成这项工作所需要的。

编辑: 这些块中的每一个都包含许多其他子块,我正在考虑以字节为单位计算数据大小,因为 count 不会在这里完成这项工作。

【问题讨论】:

  • 您要使用什么计量单位?单词、字符、字节?
  • 如何定义数据的大小
  • 字节...这就是我的想法...
  • 看起来这是 XML 解析器的结果。如果是这样,解析器本身具有获取大小的方法。你能指定这个结构的来源吗?

标签: php arrays size


【解决方案1】:
echo  mb_strlen(serialize((array)$arr), '8bit');

【讨论】:

  • 没有给出额外的信息,但是一个不错的单行。虽然它也计算括号、逗号和引号。
  • 不错的解决方案,您可以只使用strlen() 而不是mb_strlen(),因为 strlen() 在字符串中逐字节迭代。
【解决方案2】:

如果我理解你的问题,你需要主数组中每个“块”子数组的大小。

你可以这样做:

$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 编码的字符串。

【讨论】:

  • 检查代码编辑...由于api响应的结构,这不会这样做
  • 最里面的数组里面的数据是什么?字符串和整数?
  • 各种,整数/字符串/布尔值
  • 为什么 $getSize($a).... 它的目的是什么,因为它现在返回一个错误
  • 我的错,$字符明显错了。我正在编辑答案以修复它。
【解决方案3】:

要获取字节大小,您可以使用以下代码。

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

希望对你有所帮助。

【讨论】:

    【解决方案4】:

    你的意思是这样的吗?

    $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;
    }
    

    【讨论】:

    • 检查代码编辑...由于api响应的结构,这不会这样做
    • @w0rldart 查看我编辑的答案,看看它现在是否符合您的要求。
    • 不错的功能,但不会这样做...我认为唯一可能的方法是返回数组的字节大小
    • @w0rldart strlen 将返回字节数,除非文本包含多字节字符。
    猜你喜欢
    • 2020-07-24
    • 1970-01-01
    • 2020-07-29
    • 2011-08-16
    • 2022-01-16
    • 2016-05-03
    • 2015-11-04
    • 2022-07-22
    • 2018-09-08
    相关资源
    最近更新 更多