【问题标题】:How to select an array within an array PHP如何在数组 PHP 中选择一个数组
【发布时间】:2014-02-08 02:28:57
【问题描述】:

我正在尝试在这里执行一些数组感知:数组中的数组。我有一个字符串表单,它将隐藏值传递给下一个表单。其中一个表单将一组复选框值提交给另一个表单。然后,该表单将所有以前的表单提交到数据库中。除了一个问题,它工作得很好。当通过另一个表单传递复选框数组时,它会将数组放入另一个数组中。我想选择嵌套数组并将其存储在局部变量中。该数组称为兴趣

Array ( [0] => Array ( [0] => movies [1] => art [2] => cars [3] => business [4] => comedy [5] => technology ) )

现在我的数组看起来像上面的数组。当我像这样将 [0] 添加到 $_POST['interests'] 时:

$int = $_POST['interests'][0];

它成功地将第二个数组存储到变量 int 中。问题是它将它存储为字符串而不是数组。当我回显它时,它仍然看起来像一个数组

Array ( [0] => movies [1] => art [2] => cars [3] => business [4] => comedy [5] => technology )

如何将嵌套数组存储在变量中。或者如何把上面的字符串变成一个数组。

谢谢

【问题讨论】:

  • 我从未听说过包含这样的字符串的 POST 变量。我想你很困惑。
  • 你是附和它还是使用print_r()
  • 如果有什么东西以这种方式格式化输入,我建议你改变它。解析该格式不可靠,它不使用唯一分隔符。例如,请改用 JSON。
  • @Bamar 当我回显整个数组时,我使用 print_r。当我回显第二个数组时,我可以同时使用两个
  • 我不明白你的问题。我假设您有名称为“name="checkbox_name[]" 的复选框集。这应该有效,并且您的输出看起来正确。我不明白您所说的以字符串形式存储是什么意思?

标签: php arrays forms


【解决方案1】:

如果我明白你的意思(而且如果是一个很大的如果),你可以使用以下内容:

原始页面:

<form method="POST" ... >
    <input type='checkbox' name='passable[interests][]' value='movies'>
    <input type='checkbox' name='passable[interests][]' value='art'>
    <input type='checkbox' name='passable[interests][]' value='cars'>
    <input type='checkbox' name='passable[interests][]' value='business'>
    <input type='checkbox' name='passable[interests][]' value='comedy'>
    <input type='checkbox' name='passable[interests][]' value='technology'>
</form>

中间页面:

<?php
function pass_previous_data ()
{
    foreach ($_POST['passable'] as $name => $block)
    foreach ($block as $value)
    {
        echo "<input type='hidden' name='passable[$name][]' value='$value'>";
    }
}
?>

<form method="POST" ... >

    // by default, form fields will not be forwarded
    <input type='text' name='added_data' value='whatever'>

    // inject previous data as hidden fields
    <?php pass_previous_data (); ?> 

    // add more forwardable data
    <input type='checkbox' name='passable[languages][]' value='English'>
    <input type='checkbox' name='passable[languages][]' value='Español'>
    <input type='checkbox' name='passable[languages][]' value='Deutsch'>
    <input type='checkbox' name='passable[languages][]' value='Русский'>
</form>

最后一页应将选定值的整个数据包视为一个数组。

系统允许您通过将输入名称声明为passable来跨多个页面转发数据。
它使检索数据变得非常简单,只需最少的 PHP 代码。

说了这么多,这是一种非常低效的数据传递方式:
您生成一个完整的隐藏 HTML 输入来传递每个单个值。

您可以改为使用 Json 或 PHP 序列化机制对数组进行编码,但我想您有理由不这样做。


这是上面示例的单页工作演示(虽然有点被 PHP/HTML 混合混淆了)

<!DOCTYPE html>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<?php
// recreate hidden fields to forward previous post data
function pass_previous_data ()
{
    foreach ($_POST['passable'] as $name => $block)
    foreach ($block as $value)
    {
        echo "<input type='hidden' name='passable[$name][]' value='$value'>";
    }
}
if (!isset($_POST['page']))
{ // first page
?>

<body onload='document.getElementById("post").submit();'>
    <form method="POST" id="post">
        <input type='hidden' name='page' value='2'>
        <input type='checkbox' name='passable[interests][]' value='movies' checked>
        <input type='checkbox' name='passable[interests][]' value='art' checked>
        <input type='checkbox' name='passable[interests][]' value='cars'>
        <input type='checkbox' name='passable[interests][]' value='business'>
        <input type='checkbox' name='passable[interests][]' value='comedy'>
        <input type='checkbox' name='passable[interests][]' value='technology' checked>
    </form>
</body>

<?php } else switch ($_POST['page']) {
case '2':  // second page 
?>

<body onload='document.getElementById("post").submit();'>
    <form method="POST" id="post">
        <input type='hidden' name='page' value='3'>
        <?php pass_previous_data (); ?>

        <input type='text' name='added_data' value='whatever'>

        <input type='checkbox' name='passable[languages][]' value='English' checked>
        <input type='checkbox' name='passable[languages][]' value='Español'>
        <input type='checkbox' name='passable[languages][]' value='Deutsch' checked>
        <input type='checkbox' name='passable[languages][]' value='Русский' checked>

    </form>
</body>

<?php break; 
case '3': 
    // final page
    echo"<pre>";print_r ($_POST);echo"</pre>";
    break;
}
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2017-12-13
    • 2013-07-17
    • 1970-01-01
    相关资源
    最近更新 更多