PHP通过多个键对数组进行过滤,并用匹配的键对数组进行分组

时间:2018-12-05 17:48:25

标签: php

我有一个数组数组,我想按多个键值过滤该数组,并用匹配的键对数组进行分组(如果有)。数组示例:

Array
(
    [0] => Array
        (
            [id] => 1
            [value] => 11
            [quantity] => 14
        )

    [1] => Array
        (
            [id] => 2
            [value] => 11
            [quantity] => 14
        )

    [2] => Array
        (
            [id] => 3
            [value] => 22
            [quantity] => 14
        )

    [3] => Array
        (
            [id] => 4
            [value] => 22
            [quantity] => 14
        )
    [4] => Array
        (
            [id] => 5
            [value] => 23
            [quantity] => 15
        )
)

假设我希望将具有匹配的值和数量的数组分组到一个新数组中

所需的输出将是这样的:

Array
(
    [11] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [value] => 11
                    [quantity] => 14
                )

            [1] => Array
                (
                    [id] => 2
                    [value] => 11
                    [quantity] => 14
                )
        )
    [22] => Array
        (
            [0] => Array
                (
                    [id] => 3
                    [value] => 22
                    [quantity] => 14
                )
            [1] => Array
                (
                    [id] => 4
                    [value] => 22
                    [quantity] => 14
                )
        )

    [23] => Array
        (
            [0] => Array
                (
                    [id] => 5
                    [value] => 23
                    [quantity] => 15
                )
        )
)

我对如何实现这一目标一无所知。

4 个答案:

答案 0 :(得分:1)

一个简单的foreach遍历数组以创建一个新数组就足够了

$new_arr = [];

foreach ($inArray as $arr ) {
    $new_arr[$arr['value']][] = $arr;
}

// unset the original array if you are finished with it
// in case it is large and you could make better use
// of the memory for something else
unset($inArray);

答案 1 :(得分:1)

如果要按内部数组的多个键的值进行分组,可以将这些值连接在一起以在结果数组中形成键。

foreach ($array as $item) {
    // combine value and quantity, for example
    $key = $item['value'] . '|' . $item['quantity'];
    $result[$key][] = $item;
}

答案 2 :(得分:0)

只需传递一个数组引用和一个排序键

function sortBy(&$arr,$by){
 $result=array();
 foreach($arr as $value){
  if(isset($value[$by]))
   $result[$value[$by]][]=$value;
  }
  return $result;
 }

示例

$sorted=sortBy($yourArray,'value'); //by value
$sorted=sortBy($yourArray,'id'); //by Idx
$sorted=sortBy($yourArray,'quantity'); //quantity

答案 3 :(得分:0)

如果我理解正确,您想对传递的数组键进行分组。

我通常使用laravel集合库,因为它是开箱即用的。 阿尔索,这是我的贡献。

让我们尝试一下:

function groupArray( $array, $key, $remove = null )
{
    $result = array();
    foreach (array_unique(array_column($array, $key)) as $value) {
        $result[$value] = array_map(function ( $item ) use ( $remove ) {
            unset($item[$remove]);
            return $item;
        }, array_filter($array, function ( $item ) use ( $value, $key ) {
            return $item[$key] === $value;
        }));
    }
    return $result;
}

上面的函数完成了工作,首先我们使用array_column函数获得所有选定的键值。然后,我们在数组中进行一次foreach操作,以使用提供的键来过滤数组数据,最后,如果需要的话,我们将删除所选的键(只是因为所选的键将是分组的数组键)。

用法:

    $sample = array(
    [
        'id' => 1,
        'value' => 11,
        'quantity' => 14
    ],
    [
        'id' => 2,
        'value' => 11,
        'quantity' => 14
    ],
    [
        'id' => 3,
        'value' => 22,
        'quantity' => 14
    ],
    [
        'id' => 4,
        'value' => 22,
        'quantity' => 14
    ],
    [
        'id' => 5,
        'value' => 23,
        'quantity' => 14
    ],
);
$a = groupArray($sample, 'value', 'value');
$b = groupArray($sample, 'value');
$c = groupArray($sample, 'quantity');