为什么我的小PHP脚本不起作用?

时间:2010-10-02 20:19:03

标签: php

我正在编写一个脚本,其中包含以这种格式输入的信息:

John Smith
123 Fake St
Riverwood, 11234
http://google.com

并将其变为

<location id='1'>
   name='John Smith',
   address='123 Fake St',
   city='Riverwood',
   zip=' 11234',
   website='http://google.com'
</location>

以下是代码:

$locations = $_POST['locations'];
$data = explode("\n", $locations);
$dataBlocks = explode("\n\n", $locations);
$num = 1;

for ($i=0; $i<count($dataBlocks); $i++) {

    $name = $data[0];
    $address = $data[1];
    $data2 = explode(',', $data[2]);
    $city = $data2[0];
    $zip = $data2[1];
    $website = $data[3];

    $xml = ("<location id='$num'>
                    name='$name',
                    address='$address',
                    city='$city',
                    zip='$zip',
                    website='$website'
             </location>");

    $num++;

}

现在,上面的内容适用于一个信息块,但是当我有两个或更多块这样的时候:

John Smith
123 Fake St
Riverwood, 11234
http://google.com

Peter Gunderson
345 Some St
Woodsdale, 44566
http://yahoo.com

然后我得到了这个输出:

<location id='1'>
   name='John Smith',
   address='123 Fake St',
   city='Riverwood',
   zip=' 11234',
   website='http://google.com'
</location>

<location id='2'>
   name='John Smith',
   address='123 Fake St',
   city='Riverwood',
   zip=' 11234',
   website='http://google.com'
</location>

我知道为什么会这样,这是因为我正在定义这些变量:

$name = $data[0];
$address = $data[1];
$data2 = explode(',', $data[2]);
$city = $data2[0];
$zip = $data2[1];
$website = $data[3];

基于$ data数组中的位置。所以,即使我使用循环,这些变量的值总是相同的。例如:对于John Smith,$ name变量的值应为$ data [0],对于Peter Gunderson,name变量的值应为$ data [5]。但现在两者都是$ data [0]。因此输出显示输入的每个信息块的相同名称,地址等。

所以问题是,如何修改此脚本以使输出显示每个信息块的唯一结果而不只是重复第一个?

修改

@gazler你的代码给了我上面这个例子的输出:

<location id='1'>
                    name='John Smith',
                    address='123 Fake St',
                    city='Riverwood',
                    zip=' 11234',
                    website='http://google.com'
</location>

<location id='2'>
                    name='',
                    address='Peter Smith',
                    city='',
                    zip='',
                    website='Woodsdale, 44566'
</location>

3 个答案:

答案 0 :(得分:2)

您需要在$data

的循环中更新$dataBlocks
$locations = $_POST['locations'];
$xml = '';
$dataBlocks = explode("\n\n", $locations);
$num = 1;

for ($i=0; $i<count($dataBlocks); $i++) {
    // get data for current datablock
    $data = explode("\n", $dataBlocks[$i]);
    $name = $data[0];
    $address = $data[1];
    $data2 = explode(',', $data[2]);
    $city = $data2[0];
    $zip = $data2[1];
    $website = $data[3];

    $xml .= ("<location id='$num'>
                    name='$name',
                    address='$address',
                    city='$city',
                    zip='$zip',
                    website='$website'
             </location>");
    $num++;
}

答案 1 :(得分:0)

$name = $data[$i*5];
$address = $data[($i*5)+1];
$data2 = explode(',', $data[$i*5)+2]);
$city = $data2[0];
$zip = $data2[1];
$website = $data[3];

这适用于您的脚本。

答案 2 :(得分:0)

$dataBlocks = explode("\n\n", $locations);

$num = 1;
$xml = "";
foreach($dataBlocks as $block){
    $data = explode("\n", $block);
    $name = $data[0];
    $address = $data[1];
    $data2 = explode(',', $data[2]);
    $city = $data2[0];
    $zip = $data2[1];
    $website = $data[3];

    $xml .= "<location id='$num'>
                    name='$name',
                    address='$address',
                    city='$city',
                    zip='$zip',
                    website='$website'
             </location>";

    $num++;
}

我就是这样做的。但是再一次,如果这是你想要的XML,那么这个格式就不是很好......

编辑:哦,我使用foreach,因为您根本不使用$i。如果您使用for $i,如果您明白我的意思,可以使用$num进行更改。