我有一个像这样的数组:
[
'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++;
}
}
出了什么问题?
这取决于您想要实现的目标,如果您想按块分割数组,请使用
array_chunk
方法,如果您尝试基于数字创建多维数组,您可以在循环中使用 sscanf
方法来解析值:
$result = array();
foreach ($firstArray as $value)
{
$n = sscanf($value, 'ing_%d_%s', $id, $string);
if ($n > 1)
{
$result[$id][] = $value;
}
}
<?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
)
)
我会做这样的事情:
$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;
,这样您将获得与您发布的示例完全相同的结果。
每次遇到新组时,将新组引用推入结果数组。 这样,您可以简单地将元素推入引用中,而无需查找或跟踪每个组的索引。 演示
$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',
),
)