群集PHP消息数组

时间:2015-06-09 15:08:25

标签: php arrays multidimensional-array message

我有以下情况,我在这样的数组中接收消息:

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

正如您所看到的,代码是不同的,但消息是相同的。

这一点,我知道消息会保持不变,但是我需要将代码集成到一个数组中,我怎么去做那个呢?

请记住,我实际上正在对很多这样的消息做一个foreach循环。

foreach( $ar as $array ){}

所以我必须对消息进行排序'集群',我需要的输出是这样的:

$ar[0]['message'] = "TEST MESSAGE 1";
$ar[0]['code']    = array( 566666, 255555, 256323 );

有人能以正确的方式指导我吗?

3 个答案:

答案 0 :(得分:1)

$result = [];
foreach ($ar as $item) {
    $result[$item['message']][] = $item['code'];
}

$result = array_map(
    function ($message, $code) { return compact('message', 'code'); },
    array_keys($result),
    $result
);

答案 1 :(得分:1)

如果你想获得一个包含输入数组中所有代码的数组,你可以使用一个简单的映射函数:

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

答案 2 :(得分:0)

您需要使用注释元素将它们组合在一起。

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