php数组

Red*_*Red 64 php arrays

我有以下数组

Array
(
    [0] => Array
        (
            [id] => 96
            [shipping_no] => 212755-1
            [part_no] => reterty
            [description] => tyrfyt
            [packaging_type] => PC
        )

    [1] => Array
        (
            [id] => 96
            [shipping_no] => 212755-1
            [part_no] => dftgtryh
            [description] => dfhgfyh
            [packaging_type] => PC
        )

    [2] => Array
        (
            [id] => 97
            [shipping_no] => 212755-2
            [part_no] => ZeoDark
            [description] => s%c%s%c%s
            [packaging_type] => PC
        )

)
Run Code Online (Sandbox Code Playgroud)

我该如何对数组进行分组id?是否有任何本机PHP功能可用于执行此操作?

如果我foreach上面那么我会得到一个重复的,我怎么能避免这个?

在上面的例子中id有2个项目,所以它需要在里面id.

编辑:一切工作精细:但有一种方式可以一个人实现相同的目标吗?

xda*_*azz 129

没有原生的,只需使用循环.

$result = array();
foreach ($data as $element) {
    $result[$element['id']][] = $element;
}
Run Code Online (Sandbox Code Playgroud)

  • 你不需要`if` - 真正的部分适用于这两种情况. (2认同)
  • 这里不需要 if 条件。这与`$result[$id][] = $data` 相同。尝试一下。 (2认同)

Bab*_*aba 32

您可以尝试以下方法:

$group = array();

foreach ( $array as $value ) {
    $group[$value['id']][] = $value;
}

var_dump($group);
Run Code Online (Sandbox Code Playgroud)

输出:

array
  96 => 
    array
      0 => 
        array
          'id' => int 96
          'shipping_no' => string '212755-1' (length=8)
          'part_no' => string 'reterty' (length=7)
          'description' => string 'tyrfyt' (length=6)
          'packaging_type' => string 'PC' (length=2)
      1 => 
        array
          'id' => int 96
          'shipping_no' => string '212755-1' (length=8)
          'part_no' => string 'dftgtryh' (length=8)
          'description' => string 'dfhgfyh' (length=7)
          'packaging_type' => string 'PC' (length=2)
  97 => 
    array
      0 => 
        array
          'id' => int 97
          'shipping_no' => string '212755-2' (length=8)
          'part_no' => string 'ZeoDark' (length=7)
          'description' => string 's%c%s%c%s' (length=9)
          'packaging_type' => string 'PC' (length=2)
Run Code Online (Sandbox Code Playgroud)


And*_*law 18

我只是把它扔在一起,受.NET LINQ的启发

<?php

// callable type hint may be "closure" type hint instead, depending on php version
function array_group_by(array $arr, callable $key_selector) {
  $result = array();
  foreach ($arr as $i) {
    $key = call_user_func($key_selector, $i);
    $result[$key][] = $i;
  }  
  return $result;
}

 $data = array(
        array(1, "Andy", "PHP"),
        array(1, "Andy", "C#"),
        array(2, "Josh", "C#"),
        array(2, "Josh", "ASP"),
        array(1, "Andy", "SQL"),
        array(3, "Steve", "SQL"),
    );

$grouped = array_group_by($data, function($i){  return $i[0]; });

var_dump($grouped);

?>
Run Code Online (Sandbox Code Playgroud)

瞧,你得到了

array(3) {
  [1]=>
  array(3) {
    [0]=>
    array(3) {
      [0]=>
      int(1)
      [1]=>
      string(4) "Andy"
      [2]=>
      string(3) "PHP"
    }
    [1]=>
    array(3) {
      [0]=>
      int(1)
      [1]=>
      string(4) "Andy"
      [2]=>
      string(2) "C#"
    }
    [2]=>
    array(3) {
      [0]=>
      int(1)
      [1]=>
      string(4) "Andy"
      [2]=>
      string(3) "SQL"
    }
  }
  [2]=>
  array(2) {
    [0]=>
    array(3) {
      [0]=>
      int(2)
      [1]=>
      string(4) "Josh"
      [2]=>
      string(2) "C#"
    }
    [1]=>
    array(3) {
      [0]=>
      int(2)
      [1]=>
      string(4) "Josh"
      [2]=>
      string(3) "ASP"
    }
  }
  [3]=>
  array(1) {
    [0]=>
    array(3) {
      [0]=>
      int(3)
      [1]=>
      string(5) "Steve"
      [2]=>
      string(3) "SQL"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


ato*_*mrc 18

在更具功能性的编程风格中,您可以使用 array_reduce

$groupedById = array_reduce($data, function (array $accumulator, array $element) {
  $accumulator[$element['id']][] = $element;

  return $accumulator;
}, []);
Run Code Online (Sandbox Code Playgroud)


小智 8

消费并缓存要分组的列值,然后将剩余数据作为您在结果中创建的组的新子数组推送。

function array_group(array $data, $by_column)
{
    $result = [];
    foreach ($data as $item) {
        $column = $item[$by_column];
        unset($item[$by_column]);
        $result[$column][] = $item;
    }
    return $result;
}
Run Code Online (Sandbox Code Playgroud)


Jak*_*e Z 5

如果您需要具有全套测试的 Composer 替代方案,则array_group_by函数可以实现您的需求。完全披露:我是该库的作者。

$grouped = array_group_by($arr, 'id');
Run Code Online (Sandbox Code Playgroud)

它还支持多级分组,甚至通过使用自定义回调函数进行复杂分组:

// Multilevel grouping
$grouped = array_group_by($arr, 'id', 'part_no');

// Grouping by a callback/callable function
$grouped = array_group_by($records, function ($row) {
    return $row->city;
});
Run Code Online (Sandbox Code Playgroud)