【问题标题】:PHP array_walk does nothing?PHP array_walk什么都不做?
【发布时间】:2011-09-24 18:19:44
【问题描述】:

我想将每个文件名放在 select 元素的 $xsl_dir_path(绝对路径)中。我试过这个:

$files = glob($xsl_dir_path . "/*.xsl");
array_walk($files, 'basename');

但它根本不起作用,我仍然可以看到文件的全名。 我知道我可以在遍历 $files 并构建 option 元素时应用 basename,但我想在任何 html 输出之前这样做。

【问题讨论】:

  • glob() 将始终提供完整的文件路径。如果你不想要那个,你需要事后把它剪掉
  • @Pekka 我知道,这就是为什么我想将 basename 函数应用于 glob 数组的每个元素(以一种优雅的方式 - 这意味着我不喜欢循环 $files 并创建一个新数组)。
  • 啊,我明白了。我认为这是因为 basename() 不符合 array_walk() 需要的回调类型 - 您必须构建一个直接修改第一个参数的自定义函数

标签: php arrays glob


【解决方案1】:

array_walk 在您的回调函数接受引用或使用用户定义的回调函数时很有用。在这种情况下,basename 参数不是引用。

你要的是array_map:

$files = glob($xsl_dir_path . "/*.xsl");
$files = array_map('basename', $files);

【讨论】:

    【解决方案2】:

    试试这个:

    function basename_for_walk (&$value, $key) {
        $value = basename($value);
    }
    $files = glob($xsl_dir_path . "/*.xsl");
    array_walk($files, 'basename_for_walk');
    

    【讨论】:

      【解决方案3】:

      这是因为basename() 不应该更改数组单元格的值,而只是返回新值。您需要将实际更改单元格值的函数传递给array_walk()。基于array_walk docs

      function my_basename(&$item)
      {
          $item = basaname($item);
      }
      
      $files = glob($xsl_dir_path . "/*.xsl");
      array_walk($files, 'my_basename');
      

      【讨论】:

      • 有效但看起来很丑。还是谢谢!
      猜你喜欢
      • 1970-01-01
      • 2012-07-21
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2013-09-24
      • 2019-03-08
      • 2016-12-24
      • 2017-04-18
      相关资源
      最近更新 更多