2010-04-18 70 views
2

計數匹配陣列我有一個數組結構,看起來像這樣:PHP - 在陣列

Array 
(
    [0] => Array 
     (
      [type] => image 
      [data] => Array 
       (
        [id] => 1 
        [alias] => test 
        [caption] => no caption 
        [width] => 200 
        [height] => 200 
       ) 

     ) 

    [1] => Array 
     (
      [type] => image 
      [data] => Array 
       (
        [id] => 2 
        [alias] => test2 
        [caption] => hello there 
        [width] => 150 
        [height] => 150 
       ) 

     ) 

) 

我的問題是,我如何纔能有自己的類型設置爲圖像嵌入式陣列的數量的計數(或其他任何事情)?在實踐中,這個值可以變化。

因此,上述陣列會給我的2

感謝

回答

2

答案最簡單的方法就是簡單地遍歷所有子陣列,並檢查它們的類型,遞增計數器,如果它匹配所需的類型。

$count = 0; 
foreach ($myarray as $child){ 
    if ($child['type'] == 'image'){ 
     $count++; 
    } 
} 

如果你有PHP 5.3.0或更好的,你可以使用array_reduce(未經測試):

$count = array_reduce($myarray, 
         function($c, $a){ return $c + (int)($a['type'] == 'image'); }, 
         0 
     ); 

這兩個可以移動到一個函數返回$count這將允許您指定的類型數。例如:

function countTypes(array $haystack, $type){ 
    $count = 0; 
    foreach ($haystack as $child){ 
     if ($child['type'] == $type){ 
      $count++; 
     } 
    } 
    return $count; 
} 

正如你可以看到其他的答案有更錯誤檢查,你可以做,但是你,你還沒說什麼應該是不可能的(你可能需要使用assert的)。

可能發生的錯誤:

  • 孩子不是一個數組
  • 孩子確實有type鍵設置

如果陣列應始終設置出像你的榜樣,默默地失敗(通過在if語句中進行檢查)將是一個壞主意,因爲它會在其他地方掩蓋程序中的錯誤。

+0

感謝 - 很多偉大的答案,從大家! – Sergio 2010-04-18 16:49:45

1

你必須遍歷您的數組中的每個元素,檢查元素是否符合您的條件:

$data = array(...); 

$count = 0; 
foreach ($data as $item) { 
    if ('image' === $item['type']) { 
     $count++; 
    } 
} 

var_dump($count); 
1

試試這個:

function countArray(array $arr, $arg, $filterValue) 
{ 
    $count = 0; 
    foreach ($arr as $elem) 
    { 
     if (is_array($elem) && 
       isset($elem[$arg]) && 
       $elem[$arg] == $filterValue) 
      $count++; 
    } 
    return $count; 
} 

對於你的榜樣,你會這樣稱呼它這樣的:

$result = countArray($array, 'type', 'image'); 
+0

如果沒有設置'$ elem [$ arg]',那麼它不等於'$ filter',這樣檢查有點多餘,呃?你也可以把'$ filterValue'而不是'$ filter'。 – animuson 2010-04-18 16:42:01

+0

感謝您找到的錯字。然而,不知道其他的事情 - 我相信在某些系統上你會得到一個警告...... – Franz 2010-04-18 22:37:52

1
<?php 
$arr = // as above 
$result = array(); 

for ($i = 0; $i < count($arr); $i++) 
{ 
    if (!isset($result[ $arr[$i]['type'] ])) 
     $result[ $arr[$i]['type'] ] = 0; 
    $result[ $arr[$i]['type'] ]++; 
} 

echo $result['image']; // 2 
?> 
1

除了Yacoby的回答,您可以與閉合,如果你正在使用PHP 5.3做功能性風格:

$count = 0; 
array_walk($array, function($item) 
{ 
    if ($item['type'] == 'image') 
    { 
     $count++; 
    } 
});