从阵列中收集关联的数据


Collect associated data from array

我在PHP中有以下数组:

array(29) {
  [0]=>
  string(22) "Kråksjö 111 1987-01-16"
  [1]=>
  string(18) "Kråksjö 1953-06-16"
  [2]=>
  string(25) "Skir ÄNGARNA 1 1967-07-12"
  [3]=>
  string(18) "Kråksjö 1967-07-12"
  [4]=>
  string(22) "Kråksjö 383 1928-10-03"
  [5]=>
  string(29) "Kråksjö JOHANSTORP 1928-10-03"
  [6]=>
  string(22) "Kråksjö 119 1982-11-06"
  [7]=>
  string(22) "Kråksjö 119 1957-05-16"
  [8]=>
  string(18) "Kråksjö 1926-08-21"
  [9]=>
  string(28) "Kråksjö LYCKEBORG 1926-08-21"
  [10]=>
  string(30) "Västra Vallgatan 27 1962-12-17"
  [11]=>
  string(18) "Kråksjö 1962-12-17"
  [12]=>
  string(22) "Kråksjö 111 1986-12-08"
  [13]=>
  string(22) "Kråksjö 119 1949-02-03"
  [14]=>
  string(22) "Kråksjö 135 1947-09-04"
  [15]=>
  string(22) "Kråksjö 135 1951-06-29"
  [16]=>
  string(18) "Kråksjö 1945-09-17"
  [17]=>
  string(23) "Kråksjö HAGA 1945-09-17"
  [18]=>
  string(22) "Kråksjö 135 1970-01-01"
  [19]=>
  string(22) "Kråksjö 135 1983-07-03"
  [20]=>
  string(22) "Kråksjö 383 1970-01-01"
  [21]=>
  string(18) "Kråksjö 1969-07-10"
  [22]=>
  string(24) "Nickalycke 19 1969-07-10"
  [23]=>
  string(20) "Hästebäck 1960-03-13"
  [24]=>
  string(21) "Kråksjö 51 1960-03-13"
  [25]=>
  string(21) "Kråksjö 51 1968-11-13"
  [26]=>
  string(18) "Kråksjö 1938-09-03"
  [27]=>
  string(18) "Kråksjö 1964-10-22"
  [28]=>
  string(18) "Kråksjö 1953-06-16"
} 

我想做的是计算每个家庭有多少人。正如你所看到的,Kråksjö119出现了3次,这意味着拥有该地址的是3个人。我还想计算一下家里人的年龄间隔:10-30岁、30-50岁和50-70岁。

这些数据应该用这样的表格表示:

Address         Persons in house        10-30years          30-50years          50-70years
Kråksjö 119         3                       1                   1                   1
Kråksjö 112         2                       0                   0                   2

正如您所看到的,地址在表中应该只表示一次。

我用PHP:做过这样的尝试

foreach($adress as $key => $value)
{
    $newArray[$key]['adress'] = substr($value, 0, -10); //Dela upp adressen //Get the address
    $newArray[$key]['dob'] = substr($value, -10);       //Dela upp personnummer //Get the date of birth
}
$printed_vals = array();
foreach($newArray as $arr)
{
    if(!in_array($arr['adress'], $printed_vals)) {
        $printed_vals[] = $arr['adress'];               //Unique addresses
    }
}

我不知道如何使用唯一地址

来确定出生日期间隔

在您正在制作的新数组中。使用地址作为密钥。并添加多臂作为其元素。

$newArray = array();
foreach($adress as $key => $value)
{
    $adress = substr($value, 0, -10);
    $dob = substr($value, -10);
    if(!isset($newArray[$adress])) {
         $newArray[$adress] = array();
    }
    $newArray[$adress][] = $dob;
}

更新到以下评论

<?php
$adress = array("Kråksjö 111 1987-01-16","Kråksjö 1953-06-16","Skir ÄNGARNA 1 1967-07-12","Kråksjö 1967-07-12","Kråksjö 383 1928-10-03"
,"Kråksjö JOHANSTORP 1928-10-03","Kråksjö 119 1982-11-06","Kråksjö 119 1957-05-16","Kråksjö 1926-08-21","Kråksjö LYCKEBORG 1926-08-21",
"Västra Vallgatan 27 1962-12-17","Kråksjö 1962-12-17","Kråksjö 111 1986-12-08","Kråksjö 119 1949-02-03","Kråksjö 135 1947-09-04",
"Kråksjö 135 1951-06-29","Kråksjö 1945-09-17","Kråksjö HAGA 1945-09-17","Kråksjö 135 1970-01-01","Kråksjö 135 1983-07-03"
,"Kråksjö 383 1970-01-01");
$newArray = array();
foreach($adress as $key => $value)
{
    $adress = substr($value, 0, -10);
    $dob = substr($value, -10);
    if(!isset($newArray[$adress])) {
         $newArray[$adress] = array();
    }
    $newArray[$adress][] = $dob;
}
echo "<table><tr><td>Address</td><td>Persons</td><td>10-30</td><td>30-50</td><td>50-70</td></tr>";
foreach ($newArray as $address => $val) {
    echo "<tr><td>".$address."</td><td>".count($val)."</td><td>".somefunction($val,10,30)."</td><td>".somefunction($val,30,50)."</td><td>".somefunction($val,50,70)."</td></tr>";
}
echo "<table>";
function somefunction($vals,$start,$end) {
    $count = 0;
    foreach($vals as $val) {
        $age = floor(abs(time() - strtotime($val))/(365*60*60*24));
        if( $age > $start && $age < $end)
            $count++;
    }
    return $count;
}

?>