【问题标题】:Accessing an array of $_POSTed variables in a PHP foreach loop在 PHP foreach 循环中访问 $_POSTed 变量数组
【发布时间】:2012-09-26 23:48:15
【问题描述】:

我希望从 HTML 表单中遍历一些 $_POSTed 变量。不幸的是,我无法弄清楚访问每个“行”来对其进行处理。

$_POST['names'] = array('alan', 'bob', 'carl', 'dan', 'ed');
$_POST['emails'] = array('0@.com', '1@com', '2.com', '3.com', '4.com');
$data=$_POST;

foreach($data as $index=>$row){
  doSomethingNames($row[$index]); //in reality, this would be a more complicated function that needs to access each row's variables, same for printEmails()
  doSomethingEmails($row[$index]); 
}

function doSomethingNames($row){
   print_r($row['names']);// should print alan-bob-carl-dan-ed
}

function doSomethingEmails($row){
   print_r($row['emails']); //should print 0.com-1.com-2.com-3.com-4.com
}

当前运行此代码不会打印任何内容。任何人可能会提供任何帮助来帮助我访问每一行的数据,我们将不胜感激。

【问题讨论】:

  • 为什么这个问题被否决了?我很高兴能做得更好。
  • 我想读者从代码中并不清楚您对什么感兴趣。您可能需要通过一些简单的解释来帮助他们理解。你的问题看起来很好,所以我为你重新打开了它。

标签: php arrays multidimensional-array foreach indexing


【解决方案1】:

你试图完成你不想要的事情的方式绝对不是一个有效的方式。使用PHP的数组函数implode()

function printNames($row) {
  echo implode("-", $row['names']);
}

它的作用是遍历数组的每个成员,并返回一个字符串,其中迭代值由“胶水”(在本例中为减号)分隔。请记住,胶水是可选的,执行以下操作也是有效的(尽管不鼓励,最好使用空字符串代替胶水)。

function printNames($row) {
  echo implode($row['names']);
}

【讨论】:

  • 我不在乎“胶水”。我只是为了可读性而使用它。
  • 您的for..each 也有问题,请查看另一个答案。
  • 你能用代码解释一下我的 foreach 循环有什么问题吗?
  • 关于 foreach 循环的事情是它们不会记录您正在运行的变量。不要说printNames($row[$index]);,而是说printNames($data[$index]);,然后从内爆中删除['names'],或者printNames($data);
【解决方案2】:

只需使用implode()。它将数组中的值与- 连接起来。

 function printNames($row){     
 print_r(implode('-',$row)); // should print 0aa-1bb-2cc-3dd-4ee
}

function printEmails($row){
 print_r(implode('-', $row)); //should print AA-BB-CC-DD-EE
}

编辑:

 foreach($data as $index => $row){
  foreach($row as $k =>$v) {
  if($k === 'names')
   printNames($v);
  else 
    printEmails($v);
 }
}

 function printNames($elem){
   print_r($elem); echo '-';// should print 0aa-1bb-2cc-3dd-4ee
 }

function printEmails($element){
   print_r($elem); echo'-'; //should print AA-BB-CC-DD-EE
}

【讨论】:

    【解决方案3】:

    这可以这样完成:

    $data['names'] = array('0aa', '1bb', '2cc', '3dd', '4ee');
    $data['emails'] = array('AA', 'BB', 'CC', 'DD', 'EE');
    
    foreach($data as $index => $row){
      echo $index . ': ' . implode('-', $row);
    }
    

    这将打印索引的名称并使用implode() 获取元素的字符串。

    新示例:

    $data['names'] = array('0aa', '1bb', '2cc', '3dd', '4ee');
    $data['emails'] = array('AA', 'BB', 'CC', 'DD', 'EE');
    
    for ($i = 0; $i < count($data['names']); $i++) {
      echo $data['names'][$i] . ': ' . $data['emails'][$i] . '<br />';
    }
    

    这仅在两个数组的元素数量相同时有效。

    【讨论】:

    • 我需要访问两个数组的每个成员,implode() 是无关紧要的
    • 那么你需要了解数组是如何工作的。使用数字索引时,它们从 0 开始,因此您可以像这样访问它们:$data['names'][1](将是 1bb)和 $data['emails][1] (BB)
    • 是的,我不太了解数组。你的代码让我更接近。你能在你的答案中加入这些函数调用来打印姓名/电子邮件吗?
    • 您想完成什么?你想打印什么?我假设您要打印 $name : $email。
    • 是的,我只需要了解如何设置每一行的名称和电子邮件,这样我就可以将它们输入printName()/printEmails() 函数调用并从那里访问它们。
    【解决方案4】:

    更好的方法是使用另一种数组结构:

    <?php
        $data['names'] = array('0aa', '1bb', '2cc', '3dd', '4ee');
        $data['emails'] = array('AA', 'BB', 'CC', 'DD', 'EE');
    
        $united_data = array();
        $count = count( $data['names'] );
    
        for( $i = 0; $i < $count; $i++ )
        {
            array_push( $united_data, 
                array( 'name' => $data['names'][$i], 'email' => $data['emails'][$i] )
            );
        }
    
        foreach( $united_data as $key => $val ){
            printNames( $united_data[$key] );
            printEmails( $united_data[$key] );
    
        }
    
        function printNames( $row ){
            echo 'name: ' . $row['name'] . ', ';
        }
    
        function printEmails( $row ){
            echo 'email: ' . $row['email'] . '<br>';
        }
    

    【讨论】:

    • 你能解释一下我是如何把我给的数组转换成你做的吗?
    • 您如何接收这些数组?
    • $_POST['names'] 和 $_POST['emails'] 来自 HTML 表单。
    • 使用 array_combine($_POST['names'], $_POST['emails']);
    • 将数组合并为一个$united_array 的众多变体之一。再次检查我的代码。这只是示例,请勿在生产中使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多