2012-01-26 13 views
5

Avere questa matrice:php dimensione dei dati get dell'array

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

Questi blocchi contengono i dati restituiti da api. Sapendo che ciascuna API restituisce i dati in un modo/struttura diverso, è necessario misurare/calcolare i dati/le dimensioni all'interno di ciascuno e uno di essi, quindi fare if data > X o < fare qualcosa.

È possibile? Ho cercato su google, ma ho trovato solo count() e non è quello che mi serve per farlo funzionare.

Edit: Ciascuno e dei quei blocchi contengono molti altri blocchi sub, e stavo pensando di calcolare la dimensione dei dati in byte, perché conteggio non farà il lavoro qui.

+0

Quale unità di misura stai cercando di ottenere? Parole, personaggi, byte? – jprofitt

+0

Come si definisce la * dimensione * dei dati? – DerVO

+0

byte ... questo è quello che stavo pensando ... – Alex

risposta

11

Se ho capito bene la tua domanda, hai bisogno della dimensione di ogni subarray "blocco" all'interno dell'array principale.

si può fare qualcosa di simile:

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

La matrice $sizes sarà un array associativo che i vari "blocchi" s come chiavi e la dimensione dei dati come valori.

Edit: dopo la modifica della questione, se i dati all'interno delle matrici più interne sono stringhe o interi è possibile utilizzare una funzione come questa:

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

supponendo di avere solo stringhe ASCII-encoded.

+0

modifica codice di controllo ... questo non lo farà a causa della struttura della risposta di api – Alex

+0

Che cosa sono i dati all'interno dell'array più interno? Stringhe e interi? –

+0

tutti i tipi, interi/stringhe/booleani – Alex

2

Intendi qualcosa del genere?

$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

modifica codice di controllo ... questo non lo farà a causa della struttura che la risposta di api – Alex

+0

@ w0rldart vedere la mia risposta modificata per vedere se si adatta ora alle vostre esigenze. – SERPRO

+1

bella funzione ma non lo farà ...l'unica cosa che vedo possibile esiste un modo per restituire la dimensione dei byte dell'array – Alex

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

Nessuna informazione aggiuntiva fornita, ma una bella copertina. Sebbene contenga anche parentesi, virgole e virgolette. – Kapparina

2

Per ottenere la dimensione in byte è possibile utilizzare il codice qui sotto.

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

Spero possa essere utile.

Problemi correlati