2017-06-10 63 views
0

最近,我正在开发一个项目,根据他们的'Franchaise'和'Superpower'的来源对'Superheros'和'Supervillains'进行分类。我想从数据库中获取数据,如数组#1,并将它们显示为数组#2在PHP中。在php和count数据中对数组进行分组

Array #1 

Array 
(
    [0] => Array 
    (
     [id] => 101 
     [Name] => Superman 
     [Franchise] => DC Comics 
     [Superpower] => Inherent 
    ) 

    [1] => Array 
    (
     [id] => 908 
     [Name] => Batman 
     [Franchise] => DC Comics 
     [Superpower] => Acquired 
    ) 

    [2] => Array 
    (
     [id] => 228 
     [Name] => Wolverine 
     [Franchise] => Marvel 
     [Superpower] => Acquired 
    ) 

    [3] => Array 
    (
     [id] => 158 
     [Name] => Iron Man 
     [Franchise] => Marvel 
     [Superpower] => Acquired 
    ) 

    [4] => Array 
    (
     [id] => 978 
     [Name] => Thor 
     [Franchise] => Marvel 
     [Superpower] => Inherent 
    ) 
) 

阵列#1的元素必须分组基于他们的“特权”,并指望有多少人是“固有”或在“超级大国”术语“后天”。

Array #2 


Array 
(
    [DC Comics] => Array 
    (
     [Inherent] => 1 
     [Acquired] => 1 
    ) 

    [Marvel] => Array 
    (
     [Inherent] => 1 
     [Acquired] => 2 
    ) 
) 
+1

哪里是你的代码的企图? – MikeBergerUS

+1

托尔没有继承他的超级大国。他被给了Mjolnir。 – Goose

+0

你想要算什么? 数组或相同键的数组? –

回答

1

这里是你的代码没有太多的逻辑,

foreach ($array1 as $val) { 
    if(!isset($array2[$val['Franchise']])) { 
     $array2[$val['Franchise']] = array('Inherent' => 0, 'Acquired' => 0); 
    } 
    $array2[$val['Franchise']][$val['Superpower']]++; 
} 

print_r($array2); 
+0

这正是我期待的,简单而紧凑的。谢谢.. – Satya

1
  1. array_column()功能聚集来自2D阵列的内键。

  2. array_count_values()函数计算一个数组的所有值。

使用计数值此代码段:

$a = array (array ("id" => "101", "Name" => "Superman", "Franchise" => "DC Comics", "Superpower" => "Inherent"), 
    array ("id" => "908", "Name" => "Batman", "Franchise" => "DC Comics", "Superpower" => "Acquired"), 
    array ("id" => "228", "Name" => "Wolverine", "Franchise" => "Marvel", "Superpower" => "Acquired"), 
    array ("id" => "158", "Name" => "Iron Man", "Franchise" => "Marvel", "Superpower" => "Acquired"), 
    array ("id" => "978", "Name" => "Thor", "Franchise" => "Marvel", "Superpower" => "Inherent")); 
    echo "<pre>"; 
$return = array(); 
// first group array values by franchise 
foreach($a as $val) { 
    if (!isset($return[$val['Franchise']])) { 
     $return[$val['Franchise']] = array(); 
    } 
    $return[$val['Franchise']][] = $val; 
} 
$arr = array(); 
// count elements by key value pair in particular franchise 
foreach ($return as $key => $value) { 
    $tmp = array_count_values(array_column($value, 'Superpower')); 
    $arr[$key] = $tmp; 
} 
print_r($arr); 

Demo is here

1

随着单和短array_reduce

// $arr is your initial array 
$result = array_reduce($arr, function($r, $v){ 
    if (isset($r[$v["Franchise"]][$v["Superpower"]])) { 
     $r[$v["Franchise"]][$v["Superpower"]] += $r[$v["Franchise"]][$v["Superpower"]]; 
    } else { 
     $r[$v["Franchise"]][$v["Superpower"]] = 1; 
    } 
    return $r; 
}, []); 

print_r($result); 

输出:

Array 
(
    [DC Comics] => Array 
     (
      [Inherent] => 1 
      [Acquired] => 1 
     ) 

    [Marvel] => Array 
     (
      [Acquired] => 2 
      [Inherent] => 1 
     ) 
) 
相关问题