【问题标题】:How do I apply a replace to each array element in PHP?如何对 PHP 中的每个数组元素应用替换?
【发布时间】:2013-12-05 19:01:49
【问题描述】:

我的应用程序中有一个包含所有控制器列表的数组:

$controllerlist = glob("../controllers/*_controller.php");

如何使用一个 PHP 命令在每个数组元素的开头删除 ../controllers/ 并在末尾删除 _controller.php

【问题讨论】:

  • 向我们展示输入数组和输出数组。现在还不清楚你在问什么。
  • 我觉得很清楚,输入数组应该是array('../controllers/test_controller.php', '../controllers/hello_controller.php');

标签: php arrays replace preg-replace str-replace


【解决方案1】:

如果你有这样的数组:

$array = array(  "../controllers/*_controller.php", 
                  "../controllers/*_controller.php");

然后array_map()帮你剪掉不需要的字符串。

function trimmer( $string ){
    return str_replace( "../controllers/", "", $string );
 }
 $array = array(  "../controllers/*_controller.php", 
                  "../controllers/*_controller.php");

 print_r( array_map( "trimmer", $array  ) );

http://codepad.org/VO6kyVOa

【讨论】:

    【解决方案2】:

    在这种情况下不需要正则表达式,除非您提到的内容可能有所不同。

    $array = array(
        "../controllers/test_controller.php",
        "../controllers/hello_controller.php",
        "../controllers/user_controller.php"
    );
    
    // Actual one liner..
    $list = str_replace(array('../controllers/', '_controller.php'), "", $array);
    
    var_dump($array);
    

    这将输出

    array (size=3)
      0 => string 'test' (length=4)
      1 => string 'hello' (length=5)
      2 => string 'user' (length=4)
    

    这是(我认为)你要求的。

    【讨论】:

      【解决方案3】:

      将一个数组映射到另一个数组:

      $files = array(
        '../controllers/test_controller.php',
        '../controllers/hello_controller.php'
      );
      $start = strlen('../controllers/');
      $end = strlen('_controller.php') * -1;
      
      $controllers = array_map(
        function($value) use ($start, $end) {
          return substr($value, $start, $end);
        },
        $files
      );
      var_dump($controllers);
      

      【讨论】:

        【解决方案4】:

        我不确定您是如何定义“命令”的,但我怀疑是否有一种方法可以通过一个简单的函数调用来做到这一点。

        但是,如果您只是希望它紧凑,这里有一个简单的方法:

        $controllerlist = explode('|||', str_replace(array('../controllers/', '_controller.php'), '', implode('|||', glob("../controllers/*_controller.php"))));
        

        它有点脏,但它可以在一行中完成工作。

        【讨论】:

        • 喜欢,那么简单的两句就可以记住了:$controllerlist = str_replace('../controllers/', '', glob("../controllers/*_controller.php")); $controllerlist = str_replace('_controller.php', '', $controllerlist);
        【解决方案5】:

        一个命令而不搜索和替换?是的,你可以!

        如果我没有遗漏一些重要的东西,那么如何保持简单并使用 substr 函数从头到尾切掉 15 个字符:

        substr ( $x , 15 , -15 )

        因为 glob 将始终为您提供具有该模式的字符串。

        例子:

        // test array (thanks FruityP)
        $array = array(
            "../controllers/test_controller.php",
            "../controllers/hello_controller.php",
            "../controllers/user_controller.php" );
        
        foreach($array as $x){ 
           $y=substr($x,15,-15); // Chop 15 characters from the start and end
           print("$y\n");
        }
        

        输出:

        test
        hello
        user
        

        【讨论】:

        • 你不能把它和substr_replace放在一行吗?
        • 这工作:$array = substr_replace(substr_replace($array,'',-15),'',0,15)
        【解决方案6】:

        preg_replace 也接受一个数组作为参数:

        $before = '../controllers/';
        $after = "_controller.php";
        $preg_str = preg_quote($before,"/").'(.*)'.preg_quote($after,"/");
        $controllerlist = preg_replace('/^'.$preg_str.'$/', '\1',  glob("$before*$after"));
        

        【讨论】:

          【解决方案7】:

          由于 preg_replace 可以作用于数组,你可以这样做:

          $array = array(
              "../controllers/test_controller.php",
              "../controllers/hello_controller.php",
              "../controllers/user_controller.php"
          );
          
          $array = preg_replace('~../controllers/(.+?)_controller.php~', "$1", $array);
          print_r($array);
          

          输出:

          Array
          (
              [0] => test
              [1] => hello
              [2] => user
          )
          

          【讨论】:

            【解决方案8】:

            在一个命令中在每个数组元素的开头去除 15 个字符,在结尾去除 15 个字符:

            $controllerlist = substr_replace(
                 substr_replace(
                      glob("../controllers/*_controller.php"),'',-15
                      ),'',0,15
                  )
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-04-28
              • 2013-07-04
              • 1970-01-01
              • 2018-02-15
              • 2020-06-15
              • 1970-01-01
              • 1970-01-01
              • 2017-09-20
              相关资源
              最近更新 更多