2

你好我有一个这样的字符串:

end: world: world_the_end x: 127.92422698364012 y: 49.0 z: 16.12629933731299 yaw: 181.38281 pitch: 14.804417 sand: world: world x: -1641.5 y: 71.0 z: -26.5 yaw: 90.90824 pitch: 18.818556 spider: world: world x: 31.300000011920922 y: 4.0 z: 1166.8782895110098 yaw: -0.19852135 pitch: 5.1715555 zombie: world: world x: 34.69999998807907 y: 5.0 z: 1199.704677717212 yaw: 99.74651 pitch: 8.739505 old: world: world x: -53.65626180992732 y: 73.0 z: 196.10301015333587 yaw: 116.57273 pitch: 9.224916 end3: world: world_the_end x: 286.3926594122887 y: 1.0 z: 13.586770822063027 yaw: 269.05328 pitch: 14.146775 chests: world: world x: -9.153748958043282 y: 224.0 z: 66.27320021448261 yaw: -106.30098 pitch: 39.299957 nether: world: world_nether x: -191.95650873528467 y: 49.0 z: -52.699999988079064 yaw: 22.797272 pitch: 6.7500987 endkill: world: world_the_end x: 323.4613136245915 y: 1.0 z: 5.489686192901858 yaw: 100.90347 pitch: 3.6467855 rails: world: world x: -1656.699999988079 y: 10.0 z: -283.69999998807907 yaw: 318.45834 pitch: 17.768522 blaze: world: world_nether x: -253.02856795676604 y: 53.0 z: -100.26892458131793 yaw: 91.04793 pitch: 6.150008 mine2: world: world x: -352.58729110805086 y: 72.0 z: 53.699999988079064 yaw: 27.53363 pitch: 22.949997 

我需要从中返回一个多维数组

等等对不起,我是 php 新手,所以我不是很好,请帮助我做到这一点

4

5 回答 5

2

另一种方式。使用预先存储的详细密钥:

<?php

// make a list of details
$details = array('world','x','y','z','yaw','pitch');
$detailkeys = array_flip( $details );
$str = "end: world: world_the_end x: 127.92422698364012 y: 49.0 z: 16.12629933731299 yaw: 181.38281 pitch: 14.804417 sand: world: world x: -1641.5 y: 71.0 z: -26.5 yaw: 90.90824 pitch: 18.818556 spider: world: world x: 31.300000011920922 y: 4.0 z: 1166.8782895110098 yaw: -0.19852135 pitch: 5.1715555 zombie: world: world x: 34.69999998807907 y: 5.0 z: 1199.704677717212 yaw: 99.74651 pitch: 8.739505 old: world: world x: -53.65626180992732 y: 73.0 z: 196.10301015333587 yaw: 116.57273 pitch: 9.224916 end3: world: world_the_end x: 286.3926594122887 y: 1.0 z: 13.586770822063027 yaw: 269.05328 pitch: 14.146775 chests: world: world x: -9.153748958043282 y: 224.0 z: 66.27320021448261 yaw: -106.30098 pitch: 39.299957 nether: world: world_nether x: -191.95650873528467 y: 49.0 z: -52.699999988079064 yaw: 22.797272 pitch: 6.7500987 endkill: world: world_the_end x: 323.4613136245915 y: 1.0 z: 5.489686192901858 yaw: 100.90347 pitch: 3.6467855 rails: world: world x: -1656.699999988079 y: 10.0 z: -283.69999998807907 yaw: 318.45834 pitch: 17.768522 blaze: world: world_nether x: -253.02856795676604 y: 53.0 z: -100.26892458131793 yaw: 91.04793 pitch: 6.150008 mine2: world: world x: -352.58729110805086 y: 72.0 z: 53.699999988079064 yaw: 27.53363 pitch: 22.949997";

$data = array();
// explode string by space
$fields = explode(' ', $str );

// go through parameters one by one
foreach( $fields as $field )
{
        // does it have colon ?
        if( preg_match('/:$/', $field ))
        {
                // yes. remove colon
                $field = substr( $field, 0, strlen($field)-1);
                // is it detailkey
                if( isset( $detailkeys[$field] ))
                        $key = $field;  // store as key
                else
                        $rootkey = $field;  // otherwise store as rootkey
                continue;
        } else

        // does not have colon. Let's store a value.
        $val = $field;
        $data[$rootkey][$key] = $val;
}

// all done, echo output

var_export( $data );

编辑:

这将给出这个输出:

array (
  'end' => 
  array (
    'world' => 'world_the_end',
    'x' => '127.92422698364012',
    'y' => '49.0',
    'z' => '16.12629933731299',
    'yaw' => '181.38281',
    'pitch' => '14.804417',
  ),
  'sand' => 
  array (
    'world' => 'world',
    'x' => '-1641.5',
    'y' => '71.0',
    'z' => '-26.5',
    'yaw' => '90.90824',
    'pitch' => '18.818556',
  ),
  'spider' => 
  array (
    'world' => 'world',
    'x' => '31.300000011920922',
    'y' => '4.0',
    'z' => '1166.8782895110098',
    'yaw' => '-0.19852135',
    'pitch' => '5.1715555',
  ),
  'zombie' => 
  array (
    'world' => 'world',
    'x' => '34.69999998807907',
    'y' => '5.0',
    'z' => '1199.704677717212',
    'yaw' => '99.74651',
    'pitch' => '8.739505',
  ),
  'old' => 
  array (
    'world' => 'world',
    'x' => '-53.65626180992732',
    'y' => '73.0',
    'z' => '196.10301015333587',
    'yaw' => '116.57273',
    'pitch' => '9.224916',
  ),
  'end3' => 
  array (
    'world' => 'world_the_end',
    'x' => '286.3926594122887',
    'y' => '1.0',
    'z' => '13.586770822063027',
    'yaw' => '269.05328',
    'pitch' => '14.146775',
  ),
  'chests' => 
  array (
    'world' => 'world',
    'x' => '-9.153748958043282',
    'y' => '224.0',
    'z' => '66.27320021448261',
    'yaw' => '-106.30098',
    'pitch' => '39.299957',
  ),
  'nether' => 
  array (
    'world' => 'world_nether',
    'x' => '-191.95650873528467',
    'y' => '49.0',
    'z' => '-52.699999988079064',
    'yaw' => '22.797272',
    'pitch' => '6.7500987',
  ),
  'endkill' => 
  array (
    'world' => 'world_the_end',
    'x' => '323.4613136245915',
    'y' => '1.0',
    'z' => '5.489686192901858',
    'yaw' => '100.90347',
    'pitch' => '3.6467855',
  ),
  'rails' => 
  array (
    'world' => 'world',
    'x' => '-1656.699999988079',
    'y' => '10.0',
    'z' => '-283.69999998807907',
    'yaw' => '318.45834',
    'pitch' => '17.768522',
  ),
  'blaze' => 
  array (
    'world' => 'world_nether',
    'x' => '-253.02856795676604',
    'y' => '53.0',
    'z' => '-100.26892458131793',
    'yaw' => '91.04793',
    'pitch' => '6.150008',
  ),
  'mine2' => 
  array (
    'world' => 'world',
    'x' => '-352.58729110805086',
    'y' => '72.0',
    'z' => '53.699999988079064',
    'yaw' => '27.53363',
    'pitch' => '22.949997',
  ),
)
于 2012-10-06T21:14:24.927 回答
1

有点笨拙但有效。

<?php

// make a list of upper keys
$upper = array('end', 'sand','spider','zombie','old','end3','chests','nether','endkill','rails','blaze','mine2');
$upperkeys = array_flip( $upper );
$str = "end: world: world_the_end x: 127.92422698364012 y: 49.0 z: 16.12629933731299 yaw: 181.38281 pitch: 14.804417 sand: world: world x: -1641.5 y: 71.0 z: -26.5 yaw: 90.90824 pitch: 18.818556 spider: world: world x: 31.300000011920922 y: 4.0 z: 1166.8782895110098 yaw: -0.19852135 pitch: 5.1715555 zombie: world: world x: 34.69999998807907 y: 5.0 z: 1199.704677717212 yaw: 99.74651 pitch: 8.739505 old: world: world x: -53.65626180992732 y: 73.0 z: 196.10301015333587 yaw: 116.57273 pitch: 9.224916 end3: world: world_the_end x: 286.3926594122887 y: 1.0 z: 13.586770822063027 yaw: 269.05328 pitch: 14.146775 chests: world: world x: -9.153748958043282 y: 224.0 z: 66.27320021448261 yaw: -106.30098 pitch: 39.299957 nether: world: world_nether x: -191.95650873528467 y: 49.0 z: -52.699999988079064 yaw: 22.797272 pitch: 6.7500987 endkill: world: world_the_end x: 323.4613136245915 y: 1.0 z: 5.489686192901858 yaw: 100.90347 pitch: 3.6467855 rails: world: world x: -1656.699999988079 y: 10.0 z: -283.69999998807907 yaw: 318.45834 pitch: 17.768522 blaze: world: world_nether x: -253.02856795676604 y: 53.0 z: -100.26892458131793 yaw: 91.04793 pitch: 6.150008 mine2: world: world x: -352.58729110805086 y: 72.0 z: 53.699999988079064 yaw: 27.53363 pitch: 22.949997";

$data = array();
// explode string by space
$fields = explode(' ', $str );

// go through parameters one by one
foreach( $fields as $field )
{
        // does it have colon ?
        if( preg_match('/:$/', $field ))
        {
                // yes. remove colon
                $field = substr( $field, 0, strlen($field)-1);
                // is it upperkey
                if( isset( $upperkeys[$field] ))
                        $rootkey = $field;  // store as rootkey
                else
                        $key = $field;  // otherwise store key
                continue;
        } else

        // dos not have colon. Let's store a vlue.
        $val = $field;
        $data[$rootkey][$key] = $val;
}

// all done, echo output

var_export( $data );
于 2012-10-06T21:07:09.923 回答
1

您可以编写一个小循环来表示存储在字符串中的数据结构,然后从中创建数组:

$string = "end: world: world_the_end x: 127.92422698364012 y: 49.0 z: ...";
$array = null;
$stack = array_reverse(explode(' ', $string));
$stackSize = count($stack);
$section = 0;
while ($stack) {
    $name = substr(array_pop($stack), 0, -1); $stackSize--;
    while ($stack && substr($stack[$stackSize-2], -1) !== ':') {
        $key = substr(array_pop($stack), 0, -1);
        $array[$name][$key] = array_pop($stack);
        $stackSize -= 2;
    }
}
var_dump($array);

将输出:

array(12) {
  'end' =>
  array(6) {
    'world' =>
    string(13) "world_the_end"
    'x' =>
    string(18) "127.92422698364012"
    'y' =>
    string(4) "49.0"
    'z' =>
    string(17) "16.12629933731299"
    'yaw' =>
    string(9) "181.38281"
    'pitch' =>
    string(9) "14.804417"
  }
  'sand' =>
  array(6) {
    'world' =>
    string(5) "world"
    'x' =>
    string(7) "-1641.5"
    'y' =>
    string(4) "71.0"
    'z' =>
    string(5) "-26.5"
    'yaw' =>
    string(8) "90.90824"
    'pitch' =>
    string(9) "18.818556"
  }
  'spider' =>
  array(6) {
    'world' =>
    string(5) "world"
    'x' =>
    string(18) "31.300000011920922"
    'y' =>
    string(3) "4.0"
    'z' =>
    string(18) "1166.8782895110098"
    'yaw' =>
    string(11) "-0.19852135"
    'pitch' =>
    string(9) "5.1715555"
  }
  'zombie' =>
  array(6) {
    'world' =>
    string(5) "world"
    'x' =>
    string(17) "34.69999998807907"
    'y' =>
    string(3) "5.0"
    'z' =>
    string(17) "1199.704677717212"
    'yaw' =>
    string(8) "99.74651"
    'pitch' =>
    string(8) "8.739505"
  }
  'old' =>
  array(6) {
    'world' =>
    string(5) "world"
    'x' =>
    string(18) "-53.65626180992732"
    'y' =>
    string(4) "73.0"
    'z' =>
    string(18) "196.10301015333587"
    'yaw' =>
    string(9) "116.57273"
    'pitch' =>
    string(8) "9.224916"
  }
  'end3' =>
  array(6) {
    'world' =>
    string(13) "world_the_end"
    'x' =>
    string(17) "286.3926594122887"
    'y' =>
    string(3) "1.0"
    'z' =>
    string(18) "13.586770822063027"
    'yaw' =>
    string(9) "269.05328"
    'pitch' =>
    string(9) "14.146775"
  }
  'chests' =>
  array(6) {
    'world' =>
    string(5) "world"
    'x' =>
    string(18) "-9.153748958043282"
    'y' =>
    string(5) "224.0"
    'z' =>
    string(17) "66.27320021448261"
    'yaw' =>
    string(10) "-106.30098"
    'pitch' =>
    string(9) "39.299957"
  }
  'nether' =>
  array(6) {
    'world' =>
    string(12) "world_nether"
    'x' =>
    string(19) "-191.95650873528467"
    'y' =>
    string(4) "49.0"
    'z' =>
    string(19) "-52.699999988079064"
    'yaw' =>
    string(9) "22.797272"
    'pitch' =>
    string(9) "6.7500987"
  }
  'endkill' =>
  array(6) {
    'world' =>
    string(13) "world_the_end"
    'x' =>
    string(17) "323.4613136245915"
    'y' =>
    string(3) "1.0"
    'z' =>
    string(17) "5.489686192901858"
    'yaw' =>
    string(9) "100.90347"
    'pitch' =>
    string(9) "3.6467855"
  }
  'rails' =>
  array(6) {
    'world' =>
    string(5) "world"
    'x' =>
    string(18) "-1656.699999988079"
    'y' =>
    string(4) "10.0"
    'z' =>
    string(19) "-283.69999998807907"
    'yaw' =>
    string(9) "318.45834"
    'pitch' =>
    string(9) "17.768522"
  }
  'blaze' =>
  array(6) {
    'world' =>
    string(12) "world_nether"
    'x' =>
    string(19) "-253.02856795676604"
    'y' =>
    string(4) "53.0"
    'z' =>
    string(19) "-100.26892458131793"
    'yaw' =>
    string(8) "91.04793"
    'pitch' =>
    string(8) "6.150008"
  }
  'mine2' =>
  array(6) {
    'world' =>
    string(5) "world"
    'x' =>
    string(19) "-352.58729110805086"
    'y' =>
    string(4) "72.0"
    'z' =>
    string(18) "53.699999988079064"
    'yaw' =>
    string(8) "27.53363"
    'pitch' =>
    string(9) "22.949997"
  }
}
于 2012-10-07T00:14:55.460 回答
0

这是否足够,或者您是否需要额外增加所有参数(x、y、z、俯仰、偏航...)?

    $a = 'end: world: world_the_end x: 127.92422698364012 y: 49.0 z: 16.12629933731299 yaw: 181.38281 pitch: 14.804417 sand: world: world x: -1641.5 y: 71.0 z: -26.5 yaw: 90.90824 pitch: 18.818556 spider: world: world x: 31.300000011920922 y: 4.0 z: 1166.8782895110098 yaw: -0.19852135 pitch: 5.1715555 zombie: world: world x: 34.69999998807907 y: 5.0 z: 1199.704677717212 yaw: 99.74651 pitch: 8.739505 old: world: world x: -53.65626180992732 y: 73.0 z: 196.10301015333587 yaw: 116.57273 pitch: 9.224916 end3: world: world_the_end x: 286.3926594122887 y: 1.0 z: 13.586770822063027 yaw: 269.05328 pitch: 14.146775 chests: world: world x: -9.153748958043282 y: 224.0 z: 66.27320021448261 yaw: -106.30098 pitch: 39.299957 nether: world: world_nether x: -191.95650873528467 y: 49.0 z: -52.699999988079064 yaw: 22.797272 pitch: 6.7500987 endkill: world: world_the_end x: 323.4613136245915 y: 1.0 z: 5.489686192901858 yaw: 100.90347 pitch: 3.6467855 rails: world: world x: -1656.699999988079 y: 10.0 z: -283.69999998807907 yaw: 318.45834 pitch: 17.768522 blaze: world: world_nether x: -253.02856795676604 y: 53.0 z: -100.26892458131793 yaw: 91.04793 pitch: 6.150008 mine2: world: world x: -352.58729110805086 y: 72.0 z: 53.699999988079064 yaw: 27.53363 pitch: 22.949997';
    preg_match_all('/([^:]+: [^:]+: [^:]+: \d{0,}(.\d{0,})+? y: \d{0,}(.\d{0,})+? z: \d{0,}(.\d{0,})+? yaw: \d{0,}(.\d{0,})+? pitch: \d{0,}(.\d{0,})+? )/sim', $a, $result, PREG_PATTERN_ORDER);
    for ($i = 0; $i < count($result[0]); $i++) {
        # Matched text = $result[0][$i];
        $arr[] = $result[0][$i];
    }

    var_dump($arr);
于 2012-10-06T21:08:24.833 回答
-1

从那个输入是不可能的。您无法分辨哪个元素包含在哪个元素中。

于 2012-10-06T21:03:23.363 回答