是否可以将数组作为命令行参数传递给PHP脚本?

时间:2010-05-20 10:10:52

标签: php command-line

我正在维护一个负责获取和存储传入数据的PHP库(POST,GET,命令行参数等)。我刚刚修复了一个错误,它不允许它从POST和GET获取数组变量,我想知道这是否也适用于处理命令行的部分。

您可以将数组作为命令行参数传递给PHP吗?

9 个答案:

答案 0 :(得分:13)

直接不是,在命令行中传递的所有参数都是字符串,但您可以使用查询字符串作为一个参数来传递所有变量及其名称:

php myscript.php a[]=1&a[]=2.2&a[b]=c

<?php
parse_str($argv[1]);
var_dump($a);
?>

/*
array(3) {
  [0]=> string(1) "1"
  [1]=> string(3) "2.2"
  ["b"]=>string(1) "c"
}
*/

答案 1 :(得分:10)

严格来说,没有。但是,您可以传递序列化(使用PHP的serialize()unserialize()或使用json)数组作为参数,只要脚本反序列化它。

类似

php MyScript.php "{'colors':{'red','blue','yellow'},'fruits':{'apple','pear','banana'}}"

我不认为这是理想的,但是我建议你想出一个不同的方法来解决你想要解决的任何问题。

答案 2 :(得分:7)

据说你可以使用serialize将数组和其他数据传递给命令行。

shell_exec('php myScript.php '.escapeshellarg(serialize($myArray)));

在myScript.php中:

$myArray = unserialize($argv[1]);

答案 3 :(得分:3)

以下代码块将传递数组作为一组逗号分隔值:

<?php
  $i_array = explode(',',$argv[1]);
  var_dump($i_array);
?>

输出:

php ./array_play.php 1,2,3

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}

答案 4 :(得分:3)

如果您正在通过代码执行带参数的命令行脚本,那么最好是对其进行编码 -

base64_encode(json_encode($arr));

在接收其他脚本时发送和解码它。

json_decode(base64_decode($argv[1]));

这也将解决json在键和值周围没有引号的情况下接收的问题。因为没有引号,它被认为是坏json ,你将无法解码。

答案 5 :(得分:1)

您需要找出将数组编码为字符串的一些方法。然后,您可以将此字符串作为命令行参数传递给PHP CLI,然后解码该字符串。

答案 6 :(得分:1)

按照以下说明进行操作后,您可以拨打以下电话:

phpcl yourscript.php _GET ='{“key1”:“val1”,“key2”:“val2”}'

要使其正常工作,您需要在调用脚本之前执行代码。我在linux和我的.bashrc文件中使用bash shell我设置命令行界面使php ini标志auto_prepend_file加载我的命令行bootstrap文件(这个文件应该在php_include_path的某处找到):

alias phpcl='php -d auto_prepend_file="system/bootstrap/command_line.php"'

这意味着在运行您调用的脚本之前,来自命令行的每次调用都将执行此文件。 auto_prepend_file是引导系统的好方法,我在我的标准php.ini中使用它来在系统级别设置我的最终异常和错误处理程序。设置此命令行auto_prepend_file会覆盖我的正常设置,我选择只处理命令行参数,以便我可以设置$ _GET或$ _POST。这是我前面提到的文件:

<?php
// Parse the variables given to a command line script as Query Strings of JSON.
// Variables can be passed as separate arguments or as part of a query string:
//    _GET='{ "key1": "val1", "key2": "val2" }' foo='"bar"'
// OR
//    _GET='{ "key1": "val1", "key2": "val2" }'\&foo='"bar"' 
if ($argc > 1)
{
   $parsedArgs = array(); 

   for ($i = 1; $i < $argc; $i++)
   {
      parse_str($argv[$i], $parsedArgs[$i]);
   }

   foreach ($parsedArgs as $arg)
   {
      foreach ($arg as $key => $val)
      {
         // Set the global variable of name $key to the json decoded value.
         $$key = json_decode($val, true);
      }
   }

   unset($parsedArgs);
}
?>

循环遍历所有传递的参数并使用variable variables设置全局变量(注意$$)。手册页确实说变量变量不能与超全局变量一起使用,但它似乎对$ _GET有效(我猜它也适用于POST)。我选择将值作为JSON传递。错误时json_decode的返回值为NULL,如果需要,你应该对解码进行错误检查。

答案 7 :(得分:1)

排序。

如果你传递这样的话:

$php script.php --opt1={'element1':'value1','element2':'value2'}

你在opt1参数中得到这个:

Array(
 [0] => 'element1:value1'
 [1] => 'element2:value2'
)

因此您可以使用此代码段转换它:

foreach($opt1 as $element){
    $element = explode(':', $element);
    $real_opt1[$element[0]] = $element[1];
}

将其转化为:

Array(
 [element1] => 'value1'
 [element2] => 'value2'
)

答案 8 :(得分:0)

因此,如果CLI是这样的

php path\to\script.php param1=no+array param2[]=is+array param2[]=of+two

然后读取它的函数可以是

function getArguments($args){
    unset($args[0]); //remove the path to script variable
    $string = implode('&',$args);
    parse_str($string, $params);
    return $params;
}

这会给你

Array
(
    [param1] => no array
    [param2] => Array
             (
                 [0] => is array
                 [1] => of two
             )
)