集群 PHP 消息数组
Cluster PHP messages array
我有以下情况,我正在接收这样的数组中的消息:
$ar[0]['message'] = "TEST MESSAGE 1";
$ar[0]['code'] = 566666;
$ar[1]['message'] = "TEST MESSAGE 1";
$ar[1]['code'] = 255555;
$ar[2]['message'] = "TEST MESSAGE 1";
$ar[2]['code'] = 256323;
如您所见,代码不同,但消息相同。
鉴于此,我知道消息将保持不变,但我需要将代码聚集到 1 个数组中,我将如何处理那个?
请记住,我实际上是在对很多这样的消息进行 foreach 循环。
foreach( $ar as $array ){}
所以我必须整理 'cluster' 消息,我需要的输出是这样的:
$ar[0]['message'] = "TEST MESSAGE 1";
$ar[0]['code'] = array( 566666, 255555, 256323 );
谁能指导我正确的方法?
$result = [];
foreach ($ar as $item) {
$result[$item['message']][] = $item['code'];
}
$result = array_map(
function ($message, $code) { return compact('message', 'code'); },
array_keys($result),
$result
);
您需要使用作为消息的评论元素将它们组合在一起。
$ar[0]['message'] = "TEST MESSAGE 1";
$ar[0]['code'] = 566666;
$ar[1]['message'] = "TEST MESSAGE 1";
$ar[1]['code'] = 255555;
$ar[2]['message'] = "TEST MESSAGE 1";
$ar[2]['code'] = 256323;
$grouped = [];
foreach($ar as $row) {
$grouped[$row['message']]['message'] = $row['message'];
$grouped[$row['message']]['code'][] = $row['code'];
}
$ar = array_values($grouped);
如果你想得到一个包含输入数组中所有代码的数组,你可以使用一个简单的映射函数:
function mapping($x) {
return $x['code'];
}
$codes = array_map(mapping, $ar);
或作为一个班轮:
$codes = array_map(function($x) { return $x['code'];}, $ar);
一旦你有了它,我认为实施一个完整的解决方案就很简单了。
也许是这样的函数:
function groupCodes($ar) {
return array (
'message'=> $ar[0]['message'],
'code' => array_map(function($x) { return $x['code'];}, $ar)
);
}
此函数从数组的第一个元素获取消息,然后
将所有元素的代码分组到结果数组中。
如果您想针对消息过滤代码,您可以利用 array_filter,或者在您的映射闭包中使用简单的 if。
参考文献:
http://php.net/manual/en/function.array-map.php
http://php.net/manual/en/function.array-filter.php
我有以下情况,我正在接收这样的数组中的消息:
$ar[0]['message'] = "TEST MESSAGE 1";
$ar[0]['code'] = 566666;
$ar[1]['message'] = "TEST MESSAGE 1";
$ar[1]['code'] = 255555;
$ar[2]['message'] = "TEST MESSAGE 1";
$ar[2]['code'] = 256323;
如您所见,代码不同,但消息相同。
鉴于此,我知道消息将保持不变,但我需要将代码聚集到 1 个数组中,我将如何处理那个?
请记住,我实际上是在对很多这样的消息进行 foreach 循环。
foreach( $ar as $array ){}
所以我必须整理 'cluster' 消息,我需要的输出是这样的:
$ar[0]['message'] = "TEST MESSAGE 1";
$ar[0]['code'] = array( 566666, 255555, 256323 );
谁能指导我正确的方法?
$result = [];
foreach ($ar as $item) {
$result[$item['message']][] = $item['code'];
}
$result = array_map(
function ($message, $code) { return compact('message', 'code'); },
array_keys($result),
$result
);
您需要使用作为消息的评论元素将它们组合在一起。
$ar[0]['message'] = "TEST MESSAGE 1";
$ar[0]['code'] = 566666;
$ar[1]['message'] = "TEST MESSAGE 1";
$ar[1]['code'] = 255555;
$ar[2]['message'] = "TEST MESSAGE 1";
$ar[2]['code'] = 256323;
$grouped = [];
foreach($ar as $row) {
$grouped[$row['message']]['message'] = $row['message'];
$grouped[$row['message']]['code'][] = $row['code'];
}
$ar = array_values($grouped);
如果你想得到一个包含输入数组中所有代码的数组,你可以使用一个简单的映射函数:
function mapping($x) {
return $x['code'];
}
$codes = array_map(mapping, $ar);
或作为一个班轮:
$codes = array_map(function($x) { return $x['code'];}, $ar);
一旦你有了它,我认为实施一个完整的解决方案就很简单了。
也许是这样的函数:
function groupCodes($ar) {
return array (
'message'=> $ar[0]['message'],
'code' => array_map(function($x) { return $x['code'];}, $ar)
);
}
此函数从数组的第一个元素获取消息,然后 将所有元素的代码分组到结果数组中。
如果您想针对消息过滤代码,您可以利用 array_filter,或者在您的映射闭包中使用简单的 if。
参考文献:
http://php.net/manual/en/function.array-map.php
http://php.net/manual/en/function.array-filter.php