拆分并解析字符串以创建关联数组的数组
Split and parse a string to create an array of associative arrays
如何将下面的字符串转换成二维数组?
$coordinates = "9.499819 123.920318,9.490845 123.916563,9.484644 123.922292,9.49148 123.931519,9.499755 123.925683,9.499819 123.920318";
我想用逗号分隔值对,然后用分隔符分隔每对值 space 以形成包含浮点型值的关联行。
期望的输出:
$polygon = array(
array('lat' => 9.499819, 'lng' => 123.920318),
array('lat' => 9.490845, 'lng' => 123.916563),
array('lat' => 9.484644, 'lng' => 123.922292),
array('lat' => 9.49148, 'lng' => 123.931519),
array('lat' => 9.499755, 'lng' => 123.925683),
array('lat' => 9.499819, 'lng' => 123.920318)
);
对于新贡献者,我认为使用 foreach 的解决方案更容易理解。
这些步骤在代码中有注释。
$coordinates = "9.499819 123.920318,9.490845 123.916563,9.484644 123.922292,9.49148 123.931519,9.499755 123.925683,9.499819 123.920318";
$polygon = explode(',',$coordinates);
/*
array (
0 => "9.499819 123.920318",
1 => "9.490845 123.916563",
*/
foreach($polygon as $index => $latLng){
//The element $latLng is split into two variables with list and explode.
list($lat,$lng) = explode(' ',$latLng);
//The elements are replaced by a new array with the variables $lat and $lng as float
$polygon[$index] = ['lat' => (float)$lat, 'lng' => (float)$lng];
}
//test output
echo '<pre>';
var_export($polygon);
输出:
array (
0 =>
array (
'lat' => 9.499819,
'lng' => 123.920318,
),
1 =>
array (
'lat' => 9.490845,
'lng' => 123.916563,
),
2 =>
array (
'lat' => 9.484644,
'lng' => 123.922292,
),
3 =>
array (
'lat' => 9.49148,
'lng' => 123.931519,
),
4 =>
array (
'lat' => 9.499755,
'lng' => 123.925683,
),
5 =>
array (
'lat' => 9.499819,
'lng' => 123.920318,
),
)
添加 2022-03-04:
这个 one-liner 和 preg_match_all 已经 returns 完整的结果,但有额外的数字键。
preg_match_all('~(?<lat>[0-9.]+) (?<lng>[0-9.]+),?~', $coordinates, $match,PREG_SET_ORDER);
array_map可用于去除多余的值。
$polygon = array_map(
function($row){return ['lat' => $row['lat'],'lng' => $row['lng']];},
$match
);
通过迭代调用 sscanf()
,您可以指定解析值的数据类型并将这些值推送到结果数组中。
代码:(Demo)
$coordinates = "9.499819 123.920318,9.490845 123.916563,9.484644 123.922292,9.49148 123.931519,9.499755 123.925683,9.499819 123.920318";
foreach (explode(',', $coordinates) as $i => $latLng) {
sscanf($latLng, '%f %f', $result[$i]['lat'], $result[$i]['lng']);
};
var_export($result);
输出:
array (
0 =>
array (
'lat' => 9.499819,
'lng' => 123.920318,
),
1 =>
array (
'lat' => 9.490845,
'lng' => 123.916563,
),
2 =>
array (
'lat' => 9.484644,
'lng' => 123.922292,
),
3 =>
array (
'lat' => 9.49148,
'lng' => 123.931519,
),
4 =>
array (
'lat' => 9.499755,
'lng' => 123.925683,
),
5 =>
array (
'lat' => 9.499819,
'lng' => 123.920318,
),
)
如何将下面的字符串转换成二维数组?
$coordinates = "9.499819 123.920318,9.490845 123.916563,9.484644 123.922292,9.49148 123.931519,9.499755 123.925683,9.499819 123.920318";
我想用逗号分隔值对,然后用分隔符分隔每对值 space 以形成包含浮点型值的关联行。
期望的输出:
$polygon = array(
array('lat' => 9.499819, 'lng' => 123.920318),
array('lat' => 9.490845, 'lng' => 123.916563),
array('lat' => 9.484644, 'lng' => 123.922292),
array('lat' => 9.49148, 'lng' => 123.931519),
array('lat' => 9.499755, 'lng' => 123.925683),
array('lat' => 9.499819, 'lng' => 123.920318)
);
对于新贡献者,我认为使用 foreach 的解决方案更容易理解。 这些步骤在代码中有注释。
$coordinates = "9.499819 123.920318,9.490845 123.916563,9.484644 123.922292,9.49148 123.931519,9.499755 123.925683,9.499819 123.920318";
$polygon = explode(',',$coordinates);
/*
array (
0 => "9.499819 123.920318",
1 => "9.490845 123.916563",
*/
foreach($polygon as $index => $latLng){
//The element $latLng is split into two variables with list and explode.
list($lat,$lng) = explode(' ',$latLng);
//The elements are replaced by a new array with the variables $lat and $lng as float
$polygon[$index] = ['lat' => (float)$lat, 'lng' => (float)$lng];
}
//test output
echo '<pre>';
var_export($polygon);
输出:
array (
0 =>
array (
'lat' => 9.499819,
'lng' => 123.920318,
),
1 =>
array (
'lat' => 9.490845,
'lng' => 123.916563,
),
2 =>
array (
'lat' => 9.484644,
'lng' => 123.922292,
),
3 =>
array (
'lat' => 9.49148,
'lng' => 123.931519,
),
4 =>
array (
'lat' => 9.499755,
'lng' => 123.925683,
),
5 =>
array (
'lat' => 9.499819,
'lng' => 123.920318,
),
)
添加 2022-03-04:
这个 one-liner 和 preg_match_all 已经 returns 完整的结果,但有额外的数字键。
preg_match_all('~(?<lat>[0-9.]+) (?<lng>[0-9.]+),?~', $coordinates, $match,PREG_SET_ORDER);
array_map可用于去除多余的值。
$polygon = array_map(
function($row){return ['lat' => $row['lat'],'lng' => $row['lng']];},
$match
);
通过迭代调用 sscanf()
,您可以指定解析值的数据类型并将这些值推送到结果数组中。
代码:(Demo)
$coordinates = "9.499819 123.920318,9.490845 123.916563,9.484644 123.922292,9.49148 123.931519,9.499755 123.925683,9.499819 123.920318";
foreach (explode(',', $coordinates) as $i => $latLng) {
sscanf($latLng, '%f %f', $result[$i]['lat'], $result[$i]['lng']);
};
var_export($result);
输出:
array (
0 =>
array (
'lat' => 9.499819,
'lng' => 123.920318,
),
1 =>
array (
'lat' => 9.490845,
'lng' => 123.916563,
),
2 =>
array (
'lat' => 9.484644,
'lng' => 123.922292,
),
3 =>
array (
'lat' => 9.49148,
'lng' => 123.931519,
),
4 =>
array (
'lat' => 9.499755,
'lng' => 123.925683,
),
5 =>
array (
'lat' => 9.499819,
'lng' => 123.920318,
),
)