将值添加到相同的数组键中

Add values into same array key

我确定这是一个愚蠢的问题,但我不明白原因。为什么我不能将值添加到同一个数组键中?值被覆盖。

$rows=array();
while($row = mysqli_fetch_array($result)) {
    $rows[strval($row['year'])]=array('month'=>$row['month'],'satisfaction'=>$row['sat_per_month']);
}

数组索引是唯一的。下面的代码应该适用于您的情况。

$rows=array();
while($row = mysqli_fetch_array($result)) {
    $rows[strval($row['year'])][] = array('month'=>$row['month'],'satisfaction'=>$row['sat_per_month']);
}

现在我假设您想要一个多维数组,其中包含年份,每行中包含月份和满意度作为数组。您只需使用 $rows[strval($row['year']][] 附加它,因为每个数组键都是唯一的,您当前只需覆盖它。

因此您的代码如下所示:

$rows=array();
while($row = mysqli_fetch_array($result)) {
    $rows[strval($row['year'])][] = array('month'=>$row['month'],'satisfaction'=>$row['sat_per_month']);
}

希望我正确理解了你的问题。一个数组键只能存储一个值(或一组值)所以:

$array[$key] = $value; //will overwrite what is under that key
$array[$key][] = $value //will add a value as a new sub-array node resulting in:
array(
    'key' => array (
        '0' => 'value',
    ),
)

在PHP(以及几乎所有编程语言)中,数组索引是唯一的。这意味着 $arr["teletubbies"] 不能同时是 "lala" 和 "noonoo"。这是出于一个简单的原因,如果你稍后调用 $arr["teletubbies"] PHP 则无法知道你的意思是 "lala" 还是 "noonoo"。

为了解决这个问题(你想要一些按年份排序的东西,例如 2014),建议将与键 2014 相关的值创建一个新数组,从而创建一个多维数组。您似乎明白这一点,但是您的实现是错误的,因为您现在只是将 $rows[strval($row['year'])] 更改为新内容而不是 appending新值。

这个问题有多种解决方案:

解决方案一:

$rows=array();
while($row = mysqli_fetch_array($result)) {
    //The syntax [] means: insert after the last defined key, more information at: http://php.net/manual/en/language.types.array.php look for $arr[] = 56;
    $rows[strval($row['year'])][] = array('month'=>$row['month'],'satisfaction'=>$row['sat_per_month']);
}

方案二:

$rows=array();
while($row = mysqli_fetch_array($result)) {
    //Make sure $rows[strval($row['year'])] is an array
    if (!isset($rows[strval($row['year'])])) $rows[strval($row['year'])] = Array();
    //array_push pushes a new array element to the last element of an array, documentation here: http://php.net/manual/en/function.array-push.php
    array_push($rows[strval($row['year'])],array('month'=>$row['month'],'satisfaction'=>$row['sat_per_month']));
}

可能还有其他几种解决方案,但您明白了。

要稍后调用 $rows[strval($row['year'])] 之一,您必须确保调用新创建的索引!例如:

//Three indexes! 1st is the year, 2nd is the nth child you added and third is Array("month" => "..", "satisfaction" => "...");
print_r($rows["2014"][5]);

echo $rows["2014"][3]["month"]." ".$rows["2014"][3]["satisfaction"];