2012-01-26 8 views
5

Mając tę ​​tablicę:php rozmiar danych dostać tablicowej, która

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

Te bloki zawierają dane zwrócone przez API. Wiedząc, że każdy api zwraca dane w inny sposób/strukturę, potrzebuję zmierzyć/obliczyć dane/rozmiar wewnątrz każdego z nich, a następnie zrobić if data > X lub zrobić coś.

Czy to możliwe? Szukałem google, ale znalazłem tylko count() i to nie jest to, czego potrzebuję, aby to działało.

Edit: Każda z tych i bloki zawierają wiele innych bloków sub, i myślałem obliczania rozmiaru danych w bajtach, ponieważ liczba przyzwyczajenie wykonać zadanie tutaj.

+0

Jaką jednostkę miary próbujesz uzyskać? Słowa, znaki, bajty? – jprofitt

+0

Jak zdefiniować * rozmiar * swoich danych? – DerVO

+0

bajtów ... to właśnie miałem na myśli ... – Alex

Odpowiedz

11

Jeśli dobrze zrozumiałem twoje pytanie, potrzebujesz rozmiaru każdej podwielokrotki "blokowej" wewnątrz głównej tablicy.

można zrobić coś takiego:

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

Tablica $sizes będzie asocjacyjna której różne „blok” s jak klucze i wielkość danych jako wartości.

Edit: po edycji kwestii, czy dane wewnątrz najskrytszych tablic są ciągi liczb całkowitych lub można użyć funkcji takich jak to:

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

zakładając mieć tylko ciągi ASCII kodowane.

+0

sprawdź kod edytuj ... nie zrobi tego ze względu na strukturę odpowiedzi interfejsu API – Alex

+0

Co zawiera dane wewnątrz najbardziej wewnętrznej tablicy? Ciągi i liczby całkowite? –

+0

wszystkie rodzaje, liczby całkowite/ciągi znaków/booleans – Alex

2

Masz na myśli coś takiego?

$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

sprawdź kod edycji ... to nie zrobi tego ze względu na strukturę odpowiedzi APi – Alex

+0

@ w0rldart zobacz moją zmienioną odpowiedź, aby sprawdzić, czy pasuje teraz do Twoich wymagań. – SERPRO

+1

fajna funkcja, ale nie zrobi tego ...jedyne, co widzę możliwe to sposób zwracania rozmiaru bajtów tablicy – Alex

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

Brak dodatkowych informacji, ale ładny jednolinijkowy. Chociaż liczy się również nawiasy, przecinki i cudzysłowy. – Kapparina

2

Aby uzyskać rozmiar w bajtach można użyć poniższy kod.

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

Mam nadzieję, że będzie to pomocne.

Powiązane problemy