按相关标识符对平面关联数组数据进行分组以形成二维数组

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

我有这个数组:

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),
)

我怎样才能完成这件事?

php arrays multidimensional-array mapping grouping
2个回答
1
投票

这个怎么样?

$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,...),改变数组的键是相当简单的,如果它们不是,也许你也可以保存顺序(在子数组的另一项中) )并在该数组形成后再次重组)


0
投票

无需在结果数组中写入关联的第一级键。当遇到 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);
© www.soinside.com 2019 - 2024. All rights reserved.