按值前缀对平面数组进行分组并填充索引数组的索引数组

问题描述 投票:0回答:4

我有一个像这样的数组:

[
    'ing_1_ing',
    'ing_1_amount',
    'ing_1_det',
    'ing_1_meas',
    'ing_2_ing',
    'ing_2_amount',
    'ing_2_det',
    'ing_2_meas',
]

我想将这些值分组到一个数组中,如下所示:

Array (
    [0] => Array(
        [0] => ing_1_ing
        [1] => ing_1_amount
        [2] => ing_1_det
        [3] => ing_1_meas
    )
    [1] => Array(
        [0] => ing_2_ing
        [1] => ing_2_amount
        [2] => ing_2_det
        [3] => ing_2_meas
    )
)

可能还有许多其他类似名称的项目:

ing_NUMBER_type

如何按照我想要的方式对第一个数组进行分组?我尝试过这个,但由于某种原因,

strpos()
有时会失败:

$i = 1;     
foreach ($firstArray as $t) {
    if (strpos($t, (string)$i)) {
        $secondArray[--$i][] = $t;
    } else {
        $i++;
    }
}

出了什么问题?

php arrays multidimensional-array grouping prefix
4个回答
4
投票

这取决于您想要实现的目标,如果您想按块分割数组,请使用

array_chunk
方法,如果您尝试基于数字创建多维数组,您可以在循环中使用
sscanf
方法来解析值:

$result = array();

foreach ($firstArray as $value)
{
    $n = sscanf($value, 'ing_%d_%s', $id, $string);

    if ($n > 1)
    {
        $result[$id][] = $value;
    }
}

1
投票
<?php
$ary1 = array("ing_1_ing","ing_1_amount","ing_1_det","ing_1_meas","ing_2_ing","ing_2_amount","ing_2_det","ing_2_meas");
foreach($ary1 as $val)
{
    $parts = explode("_",$val);
    $ary2[$parts[1]][]=$val;
}
?>

这会创建:

Array
(
    [1] => Array
        (
            [0] => ing_1_ing
            [1] => ing_1_amount
            [2] => ing_1_det
            [3] => ing_1_meas
        )

    [2] => Array
        (
            [0] => ing_2_ing
            [1] => ing_2_amount
            [2] => ing_2_det
            [3] => ing_2_meas
        )

)

0
投票

我会做这样的事情:

$result = array();
foreach ($firstArray as $value)
{
  preg_match('/^ing_(\d+)_/', $value, $matches);
  $number = $matches[1];
  if (!array_key_exists($number, $result))
    $result[$number] = array();
  $result[$number][] = $value;
}

基本上,您会迭代第一个数组,查看其中有什么数字,然后将其放在最终数组中的正确位置。

编辑。如果您知道数字始终从

1
开始,则可以将
$number = $matches[1];
替换为
$number = $matches[1] - 1;
,这样您将获得与您发布的示例完全相同的结果。


0
投票

每次遇到新组时,将新组引用推入结果数组。 这样,您可以简单地将元素推入引用中,而无需查找或跟踪每个组的索引。 演示

$result = [];
foreach ($array as $v) {
    sscanf($v, 'ing_%d', $group);
    if (!isset($ref[$group])) {
        $result[] =& $ref[$group];
    }
    $ref[$group][] = $v;
}
var_export($result);

输出:

array (
  0 => 
  array (
    0 => 'ing_1_ing',
    1 => 'ing_1_amount',
    2 => 'ing_1_det',
    3 => 'ing_1_meas',
  ),
  1 => 
  array (
    0 => 'ing_2_ing',
    1 => 'ing_2_amount',
    2 => 'ing_2_det',
    3 => 'ing_2_meas',
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.