我正在维护一个负责获取和存储传入数据的PHP库(POST,GET,命令行参数等)。我刚刚修复了一个错误,它不允许它从POST和GET获取数组变量,我想知道这是否也适用于处理命令行的部分。
您可以将数组作为命令行参数传递给PHP吗?
答案 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
)
)