通过键拆分关联数组
Split assoc array by keys
我有这样的数据:
$movements = [
array(
"amount" => 100,
"type" => "expense",
"Dates" => "2020-01-01"
),
array(
"amount" => 100,
"type" => "income",
"Dates" => "2020-01-01"
),
array(
"amount" => 200,
"type" => "expense",
"Dates" => "2020-02-01"
),
array(
"amount" => 200,
"type" => "income",
"Dates" => "2020-02-01"
),
array(
"amount" => 300,
"type" => "income",
"Dates" => "2020-03-01"
),
array(
"amount" => 400,
"type" => "expense",
"Dates" => "2020-04-01"
),
array(
"amount" => 400,
"type" => "income",
"Dates" => "2020-04-01"
),
]
我想像这样把它分成 3 个不同的数组:
//This are my chart labels
$dates = ["2020-01-01","2020-02-01","2020-03-01"."2020-04-01"]
//This are my datapoints
$income = [100,200,300,400]
$expense = [100,200,0,400]
对于我的生活,我今天似乎无法解决这个问题,我尝试过循环并 while/if 使用“array_colum()”,但我无法添加没有匹配日期的条目为 0。
PS:我需要那种格式的数据,我在 Laravel 视图中将其绘制在 chart.js 上。
非常感谢任何帮助。
$movements = [
[ 'amount' => 100, 'type' => 'expense', 'Dates' => '2020-01-01' ],
[ 'amount' => 100, 'type' => 'income', 'Dates' => '2020-01-01' ],
[ 'amount' => 200, 'type' => 'expense', 'Dates' => '2020-02-01' ],
[ 'amount' => 200, 'type' => 'income', 'Dates' => '2020-02-01' ],
[ 'amount' => 300, 'type' => 'income', 'Dates' => '2020-03-01' ],
[ 'amount' => 400, 'type' => 'expense', 'Dates' => '2020-04-01' ],
[ 'amount' => 400, 'type' => 'income', 'Dates' => '2020-04-01' ],
];
$dates = array_values(array_unique(array_column($movements, 'Dates')));
$income = [];
$expense = [];
foreach ($dates as $date) {
$item = array_values(array_filter($movements, fn($item) => $item['Dates'] === $date));
$amount1 = $item[0]['amount'];
$amount2 = count($item) === 2 ? $item[1]['amount'] : 0;
$expense[] = $item[0] === 'expense' ? $amount1 : $amount2;
$income[] = $item[0] === 'expense' ? $amount2 : $amount1;
}
print_r($dates);
print_r($income);
print_r($expense);
这将打印:
Array
(
[0] => 2020-01-01
[1] => 2020-02-01
[2] => 2020-03-01
[3] => 2020-04-01
)
Array
(
[0] => 100
[1] => 200
[2] => 300
[3] => 400
)
Array
(
[0] => 100
[1] => 200
[2] => 0
[3] => 400
)
我有这样的数据:
$movements = [
array(
"amount" => 100,
"type" => "expense",
"Dates" => "2020-01-01"
),
array(
"amount" => 100,
"type" => "income",
"Dates" => "2020-01-01"
),
array(
"amount" => 200,
"type" => "expense",
"Dates" => "2020-02-01"
),
array(
"amount" => 200,
"type" => "income",
"Dates" => "2020-02-01"
),
array(
"amount" => 300,
"type" => "income",
"Dates" => "2020-03-01"
),
array(
"amount" => 400,
"type" => "expense",
"Dates" => "2020-04-01"
),
array(
"amount" => 400,
"type" => "income",
"Dates" => "2020-04-01"
),
]
我想像这样把它分成 3 个不同的数组:
//This are my chart labels
$dates = ["2020-01-01","2020-02-01","2020-03-01"."2020-04-01"]
//This are my datapoints
$income = [100,200,300,400]
$expense = [100,200,0,400]
对于我的生活,我今天似乎无法解决这个问题,我尝试过循环并 while/if 使用“array_colum()”,但我无法添加没有匹配日期的条目为 0。
PS:我需要那种格式的数据,我在 Laravel 视图中将其绘制在 chart.js 上。
非常感谢任何帮助。
$movements = [
[ 'amount' => 100, 'type' => 'expense', 'Dates' => '2020-01-01' ],
[ 'amount' => 100, 'type' => 'income', 'Dates' => '2020-01-01' ],
[ 'amount' => 200, 'type' => 'expense', 'Dates' => '2020-02-01' ],
[ 'amount' => 200, 'type' => 'income', 'Dates' => '2020-02-01' ],
[ 'amount' => 300, 'type' => 'income', 'Dates' => '2020-03-01' ],
[ 'amount' => 400, 'type' => 'expense', 'Dates' => '2020-04-01' ],
[ 'amount' => 400, 'type' => 'income', 'Dates' => '2020-04-01' ],
];
$dates = array_values(array_unique(array_column($movements, 'Dates')));
$income = [];
$expense = [];
foreach ($dates as $date) {
$item = array_values(array_filter($movements, fn($item) => $item['Dates'] === $date));
$amount1 = $item[0]['amount'];
$amount2 = count($item) === 2 ? $item[1]['amount'] : 0;
$expense[] = $item[0] === 'expense' ? $amount1 : $amount2;
$income[] = $item[0] === 'expense' ? $amount2 : $amount1;
}
print_r($dates);
print_r($income);
print_r($expense);
这将打印:
Array
(
[0] => 2020-01-01
[1] => 2020-02-01
[2] => 2020-03-01
[3] => 2020-04-01
)
Array
(
[0] => 100
[1] => 200
[2] => 300
[3] => 400
)
Array
(
[0] => 100
[1] => 200
[2] => 0
[3] => 400
)