2012-01-26 13 views
5

Tener esta matriz:php tamaño de los datos del array get

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

Esos bloques contienen datos devueltos por la API. Sabiendo que cada API devuelve datos de una manera/estructura diferente, necesito medir/calcular los datos/tamaños dentro de cada uno de ellos y luego hacer if data > X o < hacer algo.

¿Es posible? He buscado en google pero solo encontré count() y eso no es lo que necesito para que esto funcione.

Editar: Todos y de los esos bloques contienen muchas otras sub-bloques, y yo estaba pensando en el cálculo del tamaño de los datos en bytes, ya que el recuento no hará el trabajo aquí.

+0

¿Qué unidad de medida está tratando de obtener? Palabras, personajes, bytes? – jprofitt

+0

¿Cómo defines el * tamaño * de tus datos? – DerVO

+0

bytes ... eso es lo que tenía en mente ... – Alex

Respuesta

11

Si entendí bien su pregunta, necesita el tamaño de cada subconjunto de "bloques" dentro de la matriz principal.

se puede hacer algo como esto:

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

La matriz $sizes será un array asociativo que los diversos bloques "s" como llaves y el tamaño de los datos como valores.

Editar: después de la edición de la pregunta, si los datos dentro de las matrices más íntimos son cadenas o enteros se puede utilizar una función como esta:

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

asumiendo tener sólo cadenas en código ASCII.

+0

código de verificación editar ... esto no lo hará debido a la estructura de la respuesta de la API – Alex

+0

¿Qué significan los datos dentro de la matriz más interna? ¿Cuerdas y enteros? –

+0

todos los tipos, enteros/cadenas/booleanos – Alex

2

¿Te refieres a algo como esto?

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

código de verificación editar ... esto no lo hará debido a la estructura de la respuesta de la API – Alex

+0

@ w0rldart ver mi respuesta editada para ver si se ajusta ahora a sus requisitos. – SERPRO

+1

buena función, pero no lo hará ...lo único que veo posible es una forma de devolver el tamaño de los bytes de la matriz – Alex

10
echo mb_strlen(serialize((array)$arr), '8bit'); 
+0

No se proporcionó información adicional, pero es un buen trazador de líneas. Aunque también cuenta con corchetes, comas y comillas. – Kapparina

2

para obtener el tamaño en bytes que puede utilizar el código de abajo.

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

Espero que sea útil.