Ciągnąłem informacje przez Curl z FedEx Cytuj SYTEM. Dostaję niezbędne informacje. Funkcje Curl poprawnie. Wyniki są dokładne. Ale kiedy próbuję dodać wyniki do tablicy, nie przekazuje je z funkcji na stronę. To jak wyniki są przechowywane w funkcji.

foreach($result->SOAPENVBody->RateReply->RateReplyDetails as $value) {
    $number = ++$number;
    $key1 = $result->SOAPENVBody->RateReply->RateReplyDetails[$number]->ServiceType;
    $value1 = $result->SOAPENVBody->RateReply->RateReplyDetails[$number]->RatedShipmentDetails[0]->ShipmentRateDetail->TotalNetCharge->Amount;


    $options[$key1] = $value1;
}

    return $options;

Wiem, że funkcja przekazuje tablicę ustawioną tak, jak testowałem go za pomocą

$key1 = '1';
$value1 = 'Hello';

Przekazano te informacje na stronie.

Kiedy echmentuję wyniki zwijania przez $ Key1 i $ Value1 (echo $key1 . $value1;) wyświetla również prawidłowe informacje na stronie. Po prostu nie przekazuje go do tablicy.

Poniżej wklejam wyniki z echa, aby pokazać, jakie informacje są pobierane

FIRST_OVERNIGHT: 194.35
PRIORITY_OVERNIGHT: 147.83
STANDARD_OVERNIGHT: 133.77
FEDEX_2_DAY_AM: 111.54
FEDEX_2_DAY: 99.78
FEDEX_EXPRESS_SAVER: 89.71
FEDEX_GROUND: 20.92

I stwierdzam, że ktoś będzie chciał zobaczyć, jak dzwonię do funkcji ... Tutaj jest z głównej strony, w której nazywana jest funkcja.

include_once('inc/functions/fedex_rate.php');
          $fedex_options = array();
         $fedex_options = fedex_rate($totalweight);

          foreach ($fedex_options as $key => $value) {
              echo '<tr><td colspan="2"><div class="margin10">'. $key .'</div></td><td colspan="2"><div class="margin10">'. $value .'</div></td></tr>'; 
          }

Próbowałem nawet używać $options, a także w pętli Foreach na stronie głównej; Jednak tak też nie działało. W końcu widziałem przykład, w którym ktoś ustawił nową tablicę za pomocą szczegółów tablicy z funkcji i tak, gdzie się zatrzymałem.


Poniżej znajduje się stawka fedex Cytuj pełną funkcję Minus poufne informacje

<?

function getProperty($var) {
if ($var == 'key') return 'xxxxxxxxx';
if ($var == 'password') return 'xxxxxxxxx';
if ($var == 'account') return 'xxxxxx';
if ($var == 'meter') return 'xxxxx';
}


function fedex_rate($totalweight) {
//your account details here
$key = getProperty('key');
$password = getProperty('password');;
$account_number = getProperty('account');
$meter_number = getProperty('meter');
$residential = '1'; // 1 = true, 0 = false
    if ($residential == 1) { $residential = 'true'; }
    if ($residential == 0) { $residential = 'false'; }
if($residential == 1) { $servicetype = 'GROUND_HOME_DELIVERY'; }
if ($residential == 0) { $servicetype = ''; }



$recipient_address = 'xxxxxxx';
$recipient_city = 'xxxxxx';
$recipient_state = 'xx';
$recipient_zip = 'xxxxx';
$recipient_county = 'xx';



$xml = '<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://fedex.com/ws/rate/v13"><SOAP-ENV:Body><ns1:RateRequest>
<ns1:WebAuthenticationDetail>
<ns1:UserCredential>
<ns1:Key>'.$key.'</ns1:Key>
<ns1:Password>'.$password.'</ns1:Password>
</ns1:UserCredential></ns1:WebAuthenticationDetail>
<ns1:ClientDetail>
<ns1:AccountNumber>'.$account_number.'</ns1:AccountNumber>
<ns1:MeterNumber>'.$meter_number.'</ns1:MeterNumber>
</ns1:ClientDetail>
<ns1:TransactionDetail><ns1:CustomerTransactionId> *** Rate Request v13 using PHP ***</ns1:CustomerTransactionId></ns1:TransactionDetail><ns1:Version><ns1:ServiceId>crs</ns1:ServiceId><ns1:Major>13</ns1:Major><ns1:Intermediate>0</ns1:Intermediate><ns1:Minor>0</ns1:Minor></ns1:Version><ns1:ReturnTransitAndCommit>true</ns1:ReturnTransitAndCommit>

<ns1:RequestedShipment>
<ns1:DropoffType>REGULAR_PICKUP</ns1:DropoffType>';
// add- if service type is selected, echo service type code.  if not, leave it out
//<ns1:ServiceType>'. $service_type .'</ns1:ServiceType>
$xml .= '<ns1:PackagingType>YOUR_PACKAGING</ns1:PackagingType>
<ns1:TotalInsuredValue>
<ns1:Currency>USD</ns1:Currency>
</ns1:TotalInsuredValue>

<ns1:Shipper>
<ns1:Contact>
<ns1:PersonName>Sender Name</ns1:PersonName>
<ns1:CompanyName>Sender Company Name</ns1:CompanyName>
<ns1:PhoneNumber></ns1:PhoneNumber>
</ns1:Contact>

<ns1:Address>
<ns1:StreetLines></ns1:StreetLines>
<ns1:City></ns1:City>
<ns1:StateOrProvinceCode></ns1:StateOrProvinceCode>
<ns1:PostalCode>xxxxxx</ns1:PostalCode>
<ns1:CountryCode>xx</ns1:CountryCode>
</ns1:Address>
</ns1:Shipper>

<ns1:Recipient>
<ns1:Contact>
<ns1:PersonName>Recipient Name</ns1:PersonName>
<ns1:CompanyName>Company Name</ns1:CompanyName>
<ns1:PhoneNumber></ns1:PhoneNumber>
</ns1:Contact>

<ns1:Address>
<ns1:StreetLines>'. $recipient_address .'</ns1:StreetLines>
<ns1:City>'. $recipient_city .'</ns1:City>
<ns1:StateOrProvinceCode>'. $recipient_state .'</ns1:StateOrProvinceCode>
<ns1:PostalCode>'. $recipient_zip .'</ns1:PostalCode>
<ns1:CountryCode>'. $recipient_county .'</ns1:CountryCode>
<ns1:Residential>'. $residential .'</ns1:Residential>
</ns1:Address>
</ns1:Recipient>

<ns1:ShippingChargesPayment>
<ns1:PaymentType>SENDER</ns1:PaymentType>
<ns1:Payor>
<ns1:ResponsibleParty>
<ns1:AccountNumber>'.$account_number.'</ns1:AccountNumber>
</ns1:ResponsibleParty>
</ns1:Payor>
</ns1:ShippingChargesPayment>

<ns1:RateRequestTypes>ACCOUNT</ns1:RateRequestTypes>

<ns1:PackageCount>1</ns1:PackageCount>
<ns1:RequestedPackageLineItems>

<ns1:SequenceNumber>1</ns1:SequenceNumber>

<ns1:GroupPackageCount>1</ns1:GroupPackageCount>

<ns1:Weight>
<ns1:Units>LB</ns1:Units>
<ns1:Value>'.$totalweight.'</ns1:Value>
</ns1:Weight>

<ns1:Dimensions>
<ns1:Length>10</ns1:Length>
<ns1:Width>10</ns1:Width>
<ns1:Height>10</ns1:Height>
<ns1:Units>IN</ns1:Units>
</ns1:Dimensions>

</ns1:RequestedPackageLineItems>

</ns1:RequestedShipment>
</ns1:RateRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://ws.fedex.com:443/web-services');
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
$result_xml = curl_exec($ch);

// remove colons and dashes to simplify the xml
$result_xml = str_replace(array(':','-'), '', $result_xml);
$result = @simplexml_load_string($result_xml);

;


$number = -1;

foreach($result->SOAPENVBody->RateReply->RateReplyDetails as $value) {
    $number = ++$number;
    $key1 = $result->SOAPENVBody->RateReply->RateReplyDetails[$number]->ServiceType;
    $value1 = $result->SOAPENVBody->RateReply->RateReplyDetails[$number]->RatedShipmentDetails[0]->ShipmentRateDetail->TotalNetCharge->Amount;
    //echo $key1 .': '. $value1 .'<br />';

    $options[$key1] = $value1;
}

    return $options;

} // function


Udało mi się uruchomić, dodając pustą wartość przed i po wynoście $ w tablicy ... ale dlaczego tak jest? Dlaczego nie mogę przekazać wartości tagu wyników $ do tablicy samodzielnie?

$key1 = ''. $result->SOAPENVBody->RateReply->RateReplyDetails[$number]->ServiceType .'';

    $value1 = ''. $result->SOAPENVBody->RateReply->RateReplyDetails[$number]->RatedShipmentDetails[0]->ShipmentRateDetail->TotalNetCharge->Amount .'';

Czy ktoś może mi powiedzieć, dlaczego nie mogę przekazać $ wynik bezpośrednio do tablicy bez dodatkowych pustych tagów? To się skończyło, że jest to problem, więc osoba, która wybiega, otrzymuje zaakceptowaną odpowiedź.

php
0
KDJ 3 czerwiec 2018, 05:16

3 odpowiedzi

Najlepsza odpowiedź

Po parsowaniu XML każdy element jest obiektem SimplexMLelement, a obiekt nie można ustawić jako klawisz w tablicy .

Kiedy concat pusty ciąg stał się ciągami zamiast obiektu. Jak wiesz, kiedy próbujesz echo wybrać obiekt, który wywołuje metodę __Tostrującą metodę (jeśli zdefiniowano).

Jeśli chcesz debugować ten problem, spróbuj zadzwonić,

var_dump($result->SOAPENVBody->RateReply->RateReplyDetails[$number]->ServiceType)

Możesz także rozwiązać to przez:

$key1 = (string)$result->SOAPENVBody->RateReply->RateReplyDetails[$number]->ServiceType;

LUB

$key1 = $result->SOAPENVBody->RateReply->RateReplyDetails[$number]->ServiceType->__toString();
2
Samiul Amin Shanto 3 czerwiec 2018, 03:41

Problem polega na tym, że opcje $ nie jest zdefiniowane wcześniej w FedEx_Rate (). Właśnie zdefiniuj go jako pustą tablicę przed foreach.

 $options = array();
 foreach($result->SOAPENVBody->RateReply->RateReplyDetails as $value) {
    ....
0
monstercode 3 czerwiec 2018, 02:32

Udało mi się uzyskać, dodając pustą wartość przed i po $ wyniku w tablicy ... Ale dlaczego tak jest? Dlaczego nie mogę przekazać wartości tagu wyników $ do tablicy samodzielnie?

$key1 = ''. $result->SOAPENVBody->RateReply->RateReplyDetails[$number]->ServiceType .'';

    $value1 = ''. $result->SOAPENVBody->RateReply->RateReplyDetails[$number]->RatedShipmentDetails[0]->ShipmentRateDetail->TotalNetCharge->Amount .'';
0
KDJ 3 czerwiec 2018, 03:00