【问题标题】:Recursively edit multidimensional array递归编辑多维数组
【发布时间】:2014-07-02 08:15:22
【问题描述】:

我有一个多维数组,其中包含一些需要修改的文本字符串。我最初的想法是递归地迭代它并进行编辑,但我意识到在内部调用该函数肯定会破坏引用,而且我看不到解决方法。

function mysqlifyArray($array)
  {
      global $connection;
      foreach ($array as &$item)
      {
          if (is_string($item))
          {
              echo $item;
              $item = mysqli_real_escape_string($connection, $item);
              echo $item.'<br>';
          }
          elseif (is_array($item))
          {
              $item = mysqlifyArray($item);
          }
      }
      unset($item);
      return $array;
  }

【问题讨论】:

  • 为什么要递归而不是循环遍历每个维度?
  • @AllanS.Hansen 因为维度的数量可能会有所不同

标签: php arrays recursion multidimensional-array


【解决方案1】:

Set reference in your function declaration

function mysqlifyArray(&$array)
{
    // ....
}

【讨论】:

    【解决方案2】:

    或者,您可以使用内置的array_walk_recursive()

    function mysqlify(&$value, $index) {
        global $connection;
        return $value = mysqli_real_escape_string($connection, $value);
    }
    
    function mysqlify_array(&$array) {
        return array_walk_recursive($array, 'mysqlify');
    }
    

    【讨论】:

      【解决方案3】:

      这可能会对您有所帮助:

      function mysqlifyArray($array)
      {
          global $connection;
          foreach ($array as $item)
          {
              if (is_string($item)) {
                  echo $item;
                  $item = mysqli_real_escape_string($connection, $item);
                  echo $item.'<br>';
              } else if (is_array($item)) {
                  $item = mysqlifyArray($item);
              }
      
              unset($item);
          }
      
          return $array;
      }
      

      注意:我不确定你为什么对 $item 变量使用引用,而是可以在方法中使用引用变量。

      【讨论】:

      • 我认为引用传递在 5.3.0 中已弃用并从 5.4.0 中删除。
      • @copper.hat 你有任何 ref 支持吗?
      • @swordofpain:看php.net/manual/en/language.references.pass.php中的第一个注释。
      • @copper.hat 这不是一回事。它表示如果您尝试在调用时(即调用函数时,例如$b = my_func(&amp;$a))强制引用,您将得到一个错误。它还说,在定义时声明 ref 就足够了(即在声明函数时,例如function my_func(&amp;$a) { ... })。我想 PHP 开发人员正在清理他们的代码库,并删除了一些边缘情况,在这些情况下你需要 def-time 和 call-time 引用才能使机制工作。
      • @swordofpain:OP 编辑​​了答案,之前有一行“$item = mysqlifyArray(&$item);”这就是我的评论所指的。我应该对我所指的内容更明确一点。
      猜你喜欢
      • 2019-07-10
      • 2017-12-28
      • 2017-11-28
      • 2019-02-20
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      相关资源
      最近更新 更多