2013-12-18 2 views
1

제목이 혼란 스럽기 때문에 명확하게 설명 할 코드가 있습니다. 덤프 여기 var_dump 기능을 사용하여 배열 내가 분명히 상수 CURLOPT_URL의 값을PHP 배열의 키를 공통 이름의 상수 값으로 대체 하시겠습니까?

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) 

을 가지고 무엇을 할 때

나는 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) 
    ); 

그러나, 다음 코드를 썼다 덤프에 10002으로 바뀌 었습니다. 그래서, 나는 오류 Warning: curl_setopt_array(): Array keys must be CURLOPT constants or equivalent integer values을 얻고, 지금이 덤프 값

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) 

를 얻기 위해이

$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) 
    ); 

에 의해 원래의 배열을 교체했다. 그래서 배열을 꼬집어 어떻게 덤프 배열에 값이없는 상수 이름을 표시 할 수 있으며, curl_setopt_array과 함께 사용하면 멋지게 작동합니다. curl_setopt_array 함수보다 한 걸음 더 빨리 사용할 수있는 함수를 찾고 있는데 배열에 필요한 변경을 할 수 있습니다. PHP 내장 함수를 통해 가능하지 않은 경우 수동으로이 함수를 생성하는 방법을 제안하십시오.

+0

참고 :이 질문은 호기심에서 제기되었습니다. 요즘 PHP를 배우고 있습니다 –

+2

문자열 키를 유지하면서 키를 '_setopt'에 전달하기 위해 [constant()'] (http://php.net/constant)를 활용하십시오. – mario

+0

@mario이 배열을 배열에 어떻게 구현할 수 있습니까? 거기에 내장 된 함수가 있나요? 아니면'for each' 루프를 사용해야합니까? –

답변

3

그 심지어 소형있는 방법은

  • constant()은 그 값에 힘줄 일정 이름을 변환을

  • array_keys() $ op에서 키를 추출합니다. TIONS 배열

  • array_map()는 값을 반환, 각 키에 constant를 시만하지만

  • array_values()이 $ 옵션의 인덱스 목록을 마지막으로

  • 값 반환 지금은 정수 키 목록의 순서를 유지 array_combine()은 두 가지 순차 숫자 키를 해당 값으로 재분석합니다.

이것은 curl을 명령하기위한 것으로 여기에 약간의 대안을 제시하고자합니다. 전반적인 질문이 아니라 구체적인 작업입니다.

저는 개인적으로 이러한 것들을 작은 hybrid/fluent wrappercurl.php을 사용하고 있습니다. 그것은 아마도 배열 옵션 방식에 비해 종종 짧은입니다 : 모든 curl_ 기능과 CURL_ 일정 접두사를 감소

$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(); 

.
(아직까지는 ->setopt_array()을 사용할 수 있습니다.)

+0

이것은 일어날 수있는 사고입니다! 클래스 내에서 사용되면 전역 함수에 "constant"라는 메서드를 선호합니다. –

+0

@EugenRieck array_map이'[$ this, 'method']'를 전달하지 않고 메서드를 호출하는 것을 본 적이 있는지 확신하지 못합니다. – mario

+0

메소드가 전역 함수와 이름이 같은 클래스 내에서 사용해보십시오. Suhosin-Patch로 PHP 5.3.10-1ubuntu3.9에서 검증되었습니다. (나는 이것에 의해 과거에 물렸다. ..) –

0

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()합니다. 나는 그것을 제공 할 의사가 없다.

편집은 마리오의 코멘트 @ 읽은 후

, 나는 버전 2부터 PHP에서 개발 후 나는 아직도 배울 많이 가지고, 발견! 나는 단순히 constant() 기능을 몰랐다. 이것은 많은 변화 :

  • 가 interims 테이블을 잊지는

에 컬을 확장

  • 변화 나중에 코드 안에 있습니다.

    curl_setopt_array($ch, 
        array_combine(
         array_map("constant", array_keys($options)), 
         array_values($options) 
        ) 
    ); 
    

    이 조금 설명하기 :

    $options=array(); 
    foreach ($dumpableoptions as $key=>$value) 
        $options[constant($key)]=$value; 
    
  • +0

    @mario에는 또 다른 고급 방법이 있습니다. –

    +0

    @ VarunAgw 그리고 내가 거기에 댓글을 달았을 때, 그것은 큰 단점이 있습니다! –

    0

    여기에 대한 덤프 기능 예입니다. 맵에 사용할 상수의 접두어와 배열을 전달하십시오.

    <?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' 
         ) 
    ); 
    
    +0

    나는 게으르다. 자동화 된 것을 찾고 있었다. 어쨌든, 답변 주셔서 감사합니다. –

    +0

    괜찮아요;) 위에서 get_defined_constants()를 사용하도록 수정했습니다. –

    관련 문제