我有这个数组:
array(
"tour_0" => 1446,
"tour_1" => 1471,
"date-from-1471" => "2014-08-07",
"date-to-1471" => "2014-08-15",
"tour_2" => 30,
"date-from-30" => 2014-08-01,
"date-to-30" => 2014-08-05,
"tour_3" => 10
)
现在,我需要将它分组到这个结构中:
array(
"0" => array("ID" => 1446),
"1" => array("ID" => 1471, "from" => "2014-08-07", "to" => "2014-08-15"),
"2" => array("ID" => 30, "from" => "2014-08-07", "to" => "2014-08-15"),
"3" => array("ID" => 10),
)
我怎样才能完成这件事?
这个怎么样?
$ret = [];
foreach($inputArray as $key => $value) {
if (preg_match('/^tour_([0-9]+)/', $key)) {
$ret[$value] = ["ID" => $value];
}
if (preg_match('/date-from-([0-9]+)/', $key, $matches)) {
$ret[$matches[1]]["from"] = $value;
}
if (preg_match('/date-to-([0-9]+)/', $key, $matches)) {
$ret[$matches[1]]["to"] = $value;
}
}
print_r($ret);
/*
Array
(
"1446" => Array ("ID" => 1446),
"1471" => Array ("ID" => 1471, "from" => "2014-08-07", "to" => "2014-08-15"),
"30" => Array ("ID" => 30, "from" => "2014-08-01", "to" => "2014-08-05"),
"10" => Array ("ID" => 10)
)*/
足够接近吗? (考虑到它们是按顺序排列的(0,1,2,3,...),改变数组的键是相当简单的,如果它们不是,也许你也可以保存顺序(在子数组的另一项中) )并在该数组形成后再次重组)
无需在结果数组中写入关联的第一级键。当遇到 id 行时,立即访问其相关的“from”和“to”值。
代码:(演示)
$result = [];
foreach ($array as $k => $v) {
if (sscanf($k, 'tour_%d', $id)) {
$result[$id]['ID'] = $v;
foreach (['from', 'to'] as $prefix) {
if (isset($array["date-$prefix-$v"])) {
$result[$id][$prefix] = $array["date-$prefix-$v"];
}
}
}
}
var_export($result);
您的示例数据仅包含显示为前缀索引的游览键,因此使用这些整数不会偏离简单地将值推入索引结果数组。您可能决定忽略这些显式键并使用
[]
来填充索引条目。
代码:(演示)
$result = [];
foreach ($array as $k => $v) {
if (str_starts_with($k, 'tour_')) {
$row = ['ID' => $v];
foreach (['from', 'to'] as $prefix) {
if (isset($array["date-$prefix-$v"])) {
$row[$prefix] = $array["date-$prefix-$v"];
}
}
$result[] = $row;
}
}
var_export($result);