在从表单中的两个字段发布后,在PHP中将两个数组组合在一起

时间:2011-06-01 17:05:06

标签: php html arrays append field

我有一个表单(ip:port)中的两个字段。我想将它们一起添加到一个字符串中,例如127.0.0.1:11111进入数据库。目前我有这种形式。

        <ul id="textlist">
            <li>IP: <input type="text" maxlength="15" size="15" name="ip[]" value="" />:<input type="text" name="port[]" maxlength="5" size="5" value="27015" /></li>
        </ul>

提交此解析。

$ip = array();
foreach ($_POST['ip'] as &$value) {
    if ($value != "") {
            if (preg_match("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,5}/", $value)) {
                $ip[] = addslashes(htmlentities($value));
            } else {
                $error = 'Invalid IP Address. Please go back and try again.';
            }
    }
}

$port = array();
foreach ($_POST['port'] as &$value) {
        if ($value != "") {
                $port[] = addslashes(htmlentities($value));
        }
    }
}

然后我最终得到2个ip和端口阵列(每个最多5个),我想在添加到数据库之前成对加入。

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

$x = 0
$ip_port = array();
foreach ($_POST['ip'] as &$value) {
    if ($value != "") {
            if (preg_match("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,5}/", $value)) {
                $ip_port[$x++]['ip'] = addslashes(htmlentities($value));
            } else {
                $error = 'Invalid IP Address. Please go back and try again.';
            }
    }
}

$x = 0
foreach ($_POST['port'] as &$value) {
        if ($value != "") {
                $ip_port[$x++]['port'] = addslashes(htmlentities($value));
        }
    }
}

foreach ($ip_post as $curr) {
    echo "{$curr['ip']}:{$curr['port']}";
}

只要您的阵列完全平行,这将起作用。您可以考虑将数字索引添加到HTML表单中,而不是依赖于排序。

答案 1 :(得分:0)

为HTML添加数字索引是个好主意,只是为了确保你有正确的对。

<ul id="textlist">
    <li>IP: <input type="text" maxlength="15" size="15" name="ip[0]" value="" />:<input type="text" name="port[0]" maxlength="5" size="5" value="27015" /></li>
    <li>IP: <input type="text" maxlength="15" size="15" name="ip[1]" value="" />:<input type="text" name="port[1]" maxlength="5" size="5" value="27015" /></li>
</ul>

之后,您可以在一个循环中安全地完成。

$pairs = array();
foreach ( $_POST['ip'] as $i => $ip ) 
{
    if ( preg_match("/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,5}/", $ip) && $_POST['port'][$i] != "" ) 
    {
        $pairs[] = sprintf('%s:%s', addslashes(htmlentities($value)), addslashes(htmlentities($_POST['port'][$i])));
    } 
}

添加一些额外的错误检查是明智的,例如检查是否设置了$_POST['port'][$i],其值等。

答案 2 :(得分:0)

通过重新格式化表单,您可以让自己的生活更轻松。您可以为ip和port字段提供显式索引,而不是依赖于[]行为,或者可以将每个ip和端口捆绑到一个更大数组的子字段中。

(以下示例中省略了对示例不重要的属性和其他内容)

选项a:

<li><input name="ip[1]" />: <input name="port[1]" /></li>
<li><input name="ip[2]" />: <input name="port[2]" /></li>
<li><input name="ip[3]" />: <input name="port[3]" /></li>
<!-- etc -->

这应该返回两个数组,一个IP数组和一个Port数组,每行的索引相同。然后,您可以使用foreach ($ip as $key => $val)并使用$ key中的值从Port数组中获取相应的值。

选项b:

<li><input name="connection[][ip]" />: <input name="connection[][port]" /></li>
<li><input name="connection[][ip]" />: <input name="connection[][port]" /></li>
<li><input name="connection[][ip]" />: <input name="connection[][port]" /></li>
<!-- etc -->

这应该返回一个数组,每行包含一个捆绑在一起的IP和端口。然后你可以只是对数组进行预测。

foreach ($connection as $row)
{
    var_dump ($row ['ip'], $row ['port']);
}