2

我在php中有这个数组,

   $mainArray = array(
      array("apple","two", "grren"),
      array("samsung","five", "red"),
      array("microsoft","one","gray"),
      array("apple","nine", "blue"),
      array("samsung","ten", "white"),
      array("nokia","seven", "yellow")
   );

我可以轻松地遍历它并提取每个数组的所有第一个条目,如下所示:

 foreach($mainArray as $w => $n) {
  $whatever =  $mainArray[$w][0];
}

我试图计算每个数组的第一个元素中有多少条目是相同的,并且结果如下:

apple (2)
samsung (2)
microsoft (1)
nokia (1)

我只是不确定这样做的正确方法是什么。

先感谢您。

4

5 回答 5

7
print_r(
    array_count_values(
        array_map('array_shift', $mainArray)
    )
);

输出(演示):

Array
(
    [apple] => 2
    [samsung] => 2
    [microsoft] => 1
    [nokia] => 1
)

所以即使我是 的忠实粉丝foreach,为什么我没有在这里使用它?

首先,要计算数组中的值,在 PHP 中我们有array_count_values. 它为我们完成了这项工作。

所以剩下的唯一问题是将所有第一个项目放入一个数组中以使用array_count_values. 这是一个典型的映射工作,我也喜欢映射,foreach所以我尝试了如果与工作array_map一起array_shift工作 - 它确实如此。

但是,您可能想寻找一个名为array_column. PHP 本身尚不提供它,但作为另一个答案中的 PHP 代码

$counts = array_count_values(array_column($mainArray, 0));
于 2012-11-09T18:18:47.237 回答
1
$count = array();
foreach($mainArray as $array) {
    $first = $array[0];
    if(!isset($count[$first])) $count[$first] = 0;
    $count[$first]++;
}

print_r($count);
于 2012-11-09T18:15:20.553 回答
1

通过将深度数组的每个第一个元素推入一个新数组($result在我的示例中)来收集它们,然后调用array_count_values()该数组。像这样:

$mainArray = array(
  array("apple","two", "grren"),
  array("samsung","five", "red"),
  array("microsoft","one","gray"),
  array("apple","nine", "blue"),
  array("samsung","ten", "white"),
  array("nokia","seven", "yellow")
);

$result = array();
foreach( $mainArray as $k => $v )
{
    // let's continue if $v is not an array or is empty
    if( !is_array( $v ) || empty( $v ) ) continue;

    $result[] = $v[ 0 ];
}

var_dump( array_count_values( $result ) );
于 2012-11-09T18:15:32.920 回答
0

您可以遍历$mainArray以构建完整的数组/值列表,然后array_count_values()在其上使用:

$firstElements = array();
foreach ($mainArray as $arr) {
    $firstElements[] = $arr[0];
}
$counts = array_count_values($firstElements);

另一种选择是循环$mainArray并插入该值作为数组的索引(如果它尚不存在),然后每次递增它(这将与array_count_values()最后做相同的事情):

$counts = array();
foreach ($mainArray as $arr) {
    if (!isset($counts[$arr[0]])) $counts[$arr[0]] = 0;
    $counts[$arr[0]]++;
}
于 2012-11-09T18:15:55.623 回答
0

你可以这样做:

foreach($mainArray as $n) {
  $count[$n[0]] = isset($count[$n[0]]) ? $count[$n[0]]++ : 1;
}

var_dump($count); //should give you something like
/*
array(4) {
  ["apple"]=>
  int(2)
  ["samsung"]=>
  int(2)
  ["microsoft"]=>
  int(1)
  ["nokia"]=>
  int(1)
}
*/
于 2012-11-09T18:16:34.360 回答