在PHP中创建多维数组

在PHP中创建多维数组,php,multidimensional-array,Php,Multidimensional Array,我有一个数据库查询结果,它是一个数组,如下所示: [{"uid":29,"totalAmount":"5400.00"}, {"uid":499,"totalAmount":"5400.00"}, {"uid":507,"totalAmount":"3960.00"}, {"uid":497,"totalAmount":"3960.00"}, {"uid":498,"totalAmount":"3960.00"}, {"uid":34,"totalAmount":"3960.00"},

我有一个数据库查询结果,它是一个数组,如下所示:

[{"uid":29,"totalAmount":"5400.00"},
 {"uid":499,"totalAmount":"5400.00"},
 {"uid":507,"totalAmount":"3960.00"},
 {"uid":497,"totalAmount":"3960.00"},
 {"uid":498,"totalAmount":"3960.00"},
 {"uid":34,"totalAmount":"3960.00"},
 {"uid":21,"totalAmount":"3240.00"},
 {"uid":27,"totalAmount":"2880.00"},
 {"uid":500,"totalAmount":"2880.00"},
 {"uid":19,"totalAmount":"2700.00"},
 {"uid":22,"totalAmount":"2700.00"},
 {"uid":20,"totalAmount":"2520.00"},
 {"uid":23,"totalAmount":"2520.00"},
 {"uid":504,"totalAmount":"1800.00"},
 {"uid":496,"totalAmount":"1440.00"},
 {"uid":26,"totalAmount":"1260.00"},
 {"uid":491,"totalAmount":"1080.00"},
 {"uid":492,"totalAmount":"720.00"},
 {"uid":464,"totalAmount":"540.00"},
 {"uid":493,"totalAmount":"540.00"},
 {"uid":76,"totalAmount":"540.00"},
 {"uid":505,"totalAmount":"180.00"},
 {"uid":506,"totalAmount":"180.00"},
 {"uid":494,"totalAmount":"180.00"},
 {"uid":495,"totalAmount":"180.00"}]
根据这个结果,我想创建一个多维数组,如下所示:

[ 
    "0" =>
    [
        "0"=>["uid"=>29, "totalAmount"=>5400 ],
        "1"=>["uid"=>499, "totalAmount"=>5400]     
    ],

   "1" =>
   [
       "0"=>["uid"=>507, "totalAmount"=>3960 ],
       "1"=>["uid"=>497, "totalAmount"=>3960],
       "2"=>["uid"=>498, "totalAmount"=>3960 ],       
       "3"=>["uid"=>34, "totalAmount"=>3960],    
    ],
]
// and so on ...
我已尝试使用
foreach

 $topEar = [];

        $amount = '';

        foreach( $topEarners as $te)
        {    
            array_push($topEar, [$te->uid=>$te->totalAmount]);
        }

       $topEar; 

您可以这样做:

$topEar = array();
$currAmountArray = array();
$amount = null;
foreach( $topEarners as $te) {
    if( !is_null($amount) && $te->totalAmount != $amount ) {
         array_push($topEar, $currAmountArray);
         $currAmountArray = array();
    }

    array_push($currAmountArray, $te);
    $amount = $te->totalAmount;
}
if( !empty($currAmountArray) ) {
   array_push($topEar, $currAmountArray);
}

print_r($topEar);
您在每次迭代中保存最后一个
$totalAmount
,只要它不改变-您将值存储在名为
$currAmountArray
的子数组中,当
$totalAmount
改变时,您将值推送到主数组


我还在
foreach
循环之后添加了一个条件,以确保
$currAmountArray
中的最后一部分数据也将被推入主数组(即
$topEar
)。

如果无法使用SQL获得所需的结构,那么这将是PHP中最简单的方法:

$topEarners = json_decode($json, true);

foreach($topEarners as $row) {
    $result[$row['totalAmount']][] = $row;
}
  • 将JSON解码为PHP数组
  • 使用
    totalAmount
    作为键循环并附加到数组中
如果要重置按键,请执行以下操作:

$result = array_values($result);

实际输出与预期输出有何不同?第一个字符串类似于json。您是否尝试过json_decode()?我也不明白你是怎么从第一个字符串到第二个字符串的。请澄清这一点。我认为这个问题不值得投否决票。因此,您需要根据
totalAmount
对值进行分组?为什么不将
分组依据添加到query@AlonEitan在提取数据及其对象数组时,它已经使用用户id进行分组。您有多个具有相同用户id的行?为什么OP“要这样做”?一个好的答案总是会有一个解释,说明做了什么以及为什么这样做,不仅是为了OP,也是为了SO的未来访问者。@JayBlanchard正确,我现在正在编辑它,并给出一些适当的解释