php взрывает тип строки геометрии mysql


Как может быть лучшим способом преобразования очень длинной строки mysql в массив (точка за точкой), я думаю, что использование explode - это способ, но для этого требуется немного больше текстовых манипуляций, прежде чем передавать строковый параметр для взрыва.

Это var_dump результата запроса:

array (size=1)
    'route' => string 'LINESTRING(-25.3233034167988 -57.640113830566406,-25.3229348965009 -57.64023184776306,-25.322653656571582 -57.63954520225525,-25.323410093517822 -57.63928771018982,-25.3229058027454 -57.6378607749939,-25.322973688164012 -57.63678789138794,-25.323371301994506 -57.63360142707825,-25.322003892857673 -57.633676528930664,-25.31995759927745 -57.633376121520996,-25.319336915717006 -57.63331174850464,-25.317988857651912 -57.63302206993103,-25.317377862364236 -57.63294696807861,-25.317688209562228 -57.62954592704773'... (length=4354)

Цель состоит в том, чтобы иметь такой массив: маршрут:

array (size=4354)
    0 => { x=> '-25.3233034167988', y=> '-57.640113830566406'}
    1 => { x=> '-25.3229348965009 ', y=> '-57.64023184776306'}

И так далее

С кодом nickb результат:

array (size=112)
  0 => 
    array (size=2)
      'x' => string '-25.3233034167988' (length=17)
      'y' => string '-57.640113830566406' (length=19)
  1 => 
    array (size=2)
      'x' => string '-25.3229348965009' (length=17)
      'y' => string '-57.64023184776306' (length=18)
  2 => 
    array (size=2)
      'x' => string '-25.322653656571582' (length=19)
      'y' => string '-57.63954520225525' (length=18)

Идеальный

Author: athospy, 2013-05-28

3 answers

Я бы выполнил некоторые простые строковые манипуляции, а затем сформировал массив с помощью str_getcsv():

$str = $array['route']; // Get the string from the array
// Get rid "LINESTRING(" and trailing ")"
$str = substr( $str, 11, (strlen( $str) - 1) - 11); 

Теперь вам просто нужно ввести свои ключи x и y, вот так:

// Form the objective array:
$objective = array();
foreach( str_getcsv( $str) as $k => $v) {
    list( $x, $y) = explode( ' ', $v);
    $objective[$k]['x'] = $x;
    $objective[$k]['y'] = $y;
}

Вы можете видеть из этой демонстрации , что это выведет:

Array ( [0] => Array ( [x] => -25.3233034167988 [y] => -57.640113830566406 ) ... etc ...)
 1
Author: nickb, 2013-05-28 14:32:27

Я думаю, что это более эффективный способ разбора строки.

$route = 'LINESTRING(-25.3233034167988 -57.640113830566406,-25.3229348965009 -57.64023184776306,-25.322653656571582 -57.63954520225525)';
preg_match_all('/([0-9.\-]+) ([0-9.\-]+)/', $route, $matches);

$result = array_map(function($x, $y)
    {
    return ['x' => $x, 'y' => $y];
    }, $matches[1], $matches[2]);

var_dump($result);
 1
Author: sectus, 2014-09-18 08:16:37

Я думаю, что вы можете использовать функцию разнесения дважды, чтобы создать свой новый массив, а затем выполнить цикл по нему и назначить ключи, как ожидалось

$string = array('route' => 'LINESTRING(-25.3233034167988 -57.640113830566406,-25.3229348965009 -57.64023184776306,-25.322653656571582 -57.63954520225525,-25.323410093517822 -57.63928771018982,-25.3229058027454 -57.6378607749939,-25.322973688164012 -57.63678789138794,-25.323371301994506 -57.63360142707825,-25.322003892857673 -57.633676528930664,-25.31995759927745 -57.633376121520996,-25.319336915717006 -57.63331174850464,-25.317988857651912 -57.63302206993103,-25.317377862364236 -57.63294696807861,-25.317688209562228 -57.62954592704773');
$new_array = array();
$final_array = array();
foreach($string as $data)
{
    $array = explode(',', $data);
    foreach($array as $value)
    {
        $new_array []= explode(' ', str_replace('LINESTRING(', '', $value));
    }

    $array_key = array('x', 'y');
    foreach($new_array as $val)
    {
        $final_array []= (array_combine($array_key, $val));
    }
}

var_dump($final_array);

Это выведет

array (size=13)
  0 => 
    array (size=2)
      'x' => string '-25.3233034167988' (length=17)
      'y' => string '-57.640113830566406' (length=19)
  1 => 
    array (size=2)
      'x' => string '-25.3229348965009' (length=17)
      'y' => string '-57.64023184776306' (length=18)
  2 => 
    array (size=2)
      'x' => string '-25.322653656571582' (length=19)
      'y' => string '-57.63954520225525' (length=18)
  3 => 
    array (size=2)
      'x' => string '-25.323410093517822' (length=19)
      'y' => string '-57.63928771018982' (length=18)
  4 => 
    array (size=2)
      'x' => string '-25.3229058027454' (length=17)
      'y' => string '-57.6378607749939' (length=17)
  5 => 
    array (size=2)
      'x' => string '-25.322973688164012' (length=19)
      'y' => string '-57.63678789138794' (length=18)
     //and so on
 0
Author: Fabio, 2013-05-28 14:34:17