Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否将PHP数组的键替换为具有公共名称的常量值?_Php_Arrays_Curl - Fatal编程技术网

是否将PHP数组的键替换为具有公共名称的常量值?

是否将PHP数组的键替换为具有公共名称的常量值?,php,arrays,curl,Php,Arrays,Curl,标题听起来可能会让人困惑,所以下面是代码,以清楚地解释 我用PHP脚本编写了以下代码 $options=array( CURLOPT_URL => 'http://site2sms.com/userregistration_next.asp', CURLOPT_REFERER => 'http://site2sms.com/UserRegistration_Next.asp', CURLOPT_USERAGENT => '

标题听起来可能会让人困惑,所以下面是代码,以清楚地解释

我用PHP脚本编写了以下代码

    $options=array(
        CURLOPT_URL => 'http://site2sms.com/userregistration_next.asp',
        CURLOPT_REFERER => 'http://site2sms.com/UserRegistration_Next.asp',
        CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31',
        CURLOPT_POST => TRUE,
        CURLOPT_POSTFIELDS => http_build_query($post_fields)
    );
但是,当使用
var\u dump
函数转储数组时,我得到的是

array (size=5)
  10002 => string 'http://site2sms.com/userregistration_next.asp' (length=45)
  10016 => string 'http://site2sms.com/UserRegistration_Next.asp' (length=45)
  10018 => string 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31' (length=108)
  47 => int 1
  10015 => string 'action=UserCreate&txtFullName=fdsf&genderCombo=Male&birth_day=2&birth_month=12&birth_year=2013&txtEmail=fdsf%40dssad&ProfessCombo=1&StateCombo=Delhi&txtMobileNum=4234&cityCombo=223&Submit=Register' (length=196)
显然,常量
CURLOPT_URL
的值在其转储中被
10002
替换。所以,我用这个替换了原来的数组

    $options=array(
        'CURLOPT_URL' => 'http://site2sms.com/userregistration_next.asp',
        'CURLOPT_REFERER' => 'http://site2sms.com/UserRegistration_Next.asp',
        'CURLOPT_USERAGENT' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31',
        'CURLOPT_POST' => TRUE,
        'CURLOPT_POSTFIELDS' => http_build_query($post_fields)
    );
获取此转储值

array (size=5)
  'CURLOPT_URL' => string 'http://site2sms.com/userregistration_next.asp' (length=45)
  'CURLOPT_REFERER' => string 'http://site2sms.com/UserRegistration_Next.asp' (length=45)


  'CURLOPT_USERAGENT' => string 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31' (length=108)
  'CURLOPT_POST' => boolean true
  'CURLOPT_POSTFIELDS' => string 'action=UserCreate&txtFullName=fdsf&genderCombo=Male&birth_day=2&birth_month=12&birth_year=2013&txtEmail=fdsf%40dssad&ProfessCombo=1&StateCombo=Delhi&txtMobileNum=4234&cityCombo=485&Submit=Register' (length=196)
现在,我得到一个错误
警告:curl\u setopt\u array():数组键必须是CURLOPT常量或等效整数值
。那么,如何调整数组,使转储数组显示常量名称而不是值,当与
curl\u setopt\u数组一起使用时,它应该可以很好地工作。我正在寻找比curl_setopt_数组函数早一步使用的函数,以便它可以对数组进行必要的更改。如果无法通过PHP内置函数实现,请建议我如何手动创建此函数。

CURLOPT_URL
(不带引号)只是整数
10002
的另一个名称-使用它的那一刻,它就被翻译了。这是一个单向的过程

如果要使用字符串表示,则需要interims表:

$dumpableoptions=array(
    'CURLOPT_URL' => 'http://site2sms.com/userregistration_next.asp',
    ...
);

$translations=array(
    'CURLOPT_URL' => CURLOPT_URL,
    ...
);
后来

$options=array();
foreach ($dumpableoptions as $key=>$value)
  $options[$translations[$key]]=$value;
或者你必须利用恐怖的恐怖:
eval()
。我不愿意为此提供代码

编辑

在阅读了@mario的评论后,我发现,在使用PHP开发第2版之后,我还有很多东西需要学习!我只是不知道
constant()
函数。这改变了很多:

  • 忘记interims表吧,它在cURL扩展中
  • 将后面的代码更改为


甚至还有一种简洁的方法:

curl_setopt_array($ch,
    array_combine(
        array_map("constant", array_keys($options)),
        array_values($options)
    )
);
对此稍作解释:

  • 将字符串常量名称转换为其值

  • 只需从$options数组中提取密钥

  • 对每个键应用
    常量
    ,返回其值,但保持现在整数键列表的顺序

  • 返回$options值的索引列表

  • 最后,按顺序将两个数字键与其值重新合并

因为你主要需要这个来指挥,我也想在这里提出一个小的替代方案。不是针对总体问题,而是针对手头的具体任务

我个人用一个小的来做这样的事情。它可能通常比数组选项方法短:

$result =
    curl()
       ->URL('http://site2sms.com/userregistration_next.asp')
       ->REFERER('http://site2sms.com/UserRegistration_Next.asp')
       ->USERAGENT('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/')
       ->POST(true)
       ->POSTFIELDS(http_build_query($post_fields))
       ->exec();
这将减少所有
curl\uuu
函数和
curl\uu
常量前缀。

(但它仍然有可用的setopt_array()

这里是一个示例转储函数。将数组和用于映射的常量前缀传递给它

<?php

function const_keyed_array_dump($arr, $const_prefix) {
        static $map = array();

        // Primative caching
        if (!$map) {
                foreach (get_defined_constants() as $name=>$val) {
                        if (strpos($name, $const_prefix) === 0) {
                                $map[$val] = $name;
                        }
                }
        }

        $output = array();

        foreach ($arr as $key=>$val) {
                $output[$map[$key]] = $val;
        }

        return $output;
}

var_dump(
        const_keyed_array_dump(
                array(
                        CURLOPT_DNS_USE_GLOBAL_CACHE => 'foo',
                        CURLFTPSSL_TRY => 'bar',
                ),
                'CURL'
        )
);

注意:我提出这个问题是出于好奇。我正在学习PHP这些天你可以保留你的字符串键,但是利用它来将它的键传递给
\u setopt
@mario我如何在我的数组中实现它?是否有一些内置函数,或者我应该为它的每个
循环
。@mario再次获得了另一种高级方法。@VarunAgw,正如我在那里评论的,它有一个很大的缺点!这是一个即将发生的事故!如果在类中使用,它将更喜欢名为“constant”的方法而不是全局函数。@EugenRieck我不确定我是否见过array\u map调用方法时没有传递
[$this,'method']
。只要在类中尝试一下,其中一个方法与全局函数同名。现在使用Suhosin补丁在PHP5.3.10-1ubuntu3.9上验证。(我过去被咬过…)@EugenRieck说真的,你得给我看看。无法使用5.3.10-1ubuntu3.8+suhosin、5.4.8、5.5.5、5.2.2、5.1.0、5.0.5或4.4.7复制它。不知道这将如何格式化:输出“foo-name”我很懒,正在寻找自动化的东西。不管怎样,谢谢你的回答。很好;)修改上述内容以使用get_定义的_常量()
<?php

function const_keyed_array_dump($arr, $const_prefix) {
        static $map = array();

        // Primative caching
        if (!$map) {
                foreach (get_defined_constants() as $name=>$val) {
                        if (strpos($name, $const_prefix) === 0) {
                                $map[$val] = $name;
                        }
                }
        }

        $output = array();

        foreach ($arr as $key=>$val) {
                $output[$map[$key]] = $val;
        }

        return $output;
}

var_dump(
        const_keyed_array_dump(
                array(
                        CURLOPT_DNS_USE_GLOBAL_CACHE => 'foo',
                        CURLFTPSSL_TRY => 'bar',
                ),
                'CURL'
        )
);