从数组中收集关联的数据

时间:2014-09-18 08:46:03

标签: php arrays

我在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
    }
}

我不知道如何使用唯一地址来显示出生日期

1 个答案:

答案 0 :(得分:0)

在您正在制作的新阵列中。使用地址作为密钥。并添加点作为其元素。

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

}


?>