-1

PHP配列の出力を数値だけのPHP変数に取得しようとしているので、それに対して算術演算を行ってから、ショッピングカートで使用するためにグローバルに保存できます。

配列を生成して操作するコードは次のとおりです。

<?php
function ups($dest_zip,$service,$weight,$length,$width,$height) {
$AccessLicenseNumber = 'XXXXXXXXXXXXX'; // Your license number
$UserId = 'XXXXXXXX'; // Username
$Password = 'XXXXXXXX'; // Password
$PostalCode = 'XXXXXX'; // Zipcode you are shipping FROM
$ShipperNumber = 'XXXXX'; // Your UPS shipper number

    $data ="<?xml version=\"1.0\"?>
    <AccessRequest xml:lang=\"en-US\">
        <AccessLicenseNumber>$AccessLicenseNumber</AccessLicenseNumber>
        <UserId>$UserId</UserId>
        <Password>$Password</Password>
    </AccessRequest>
    <?xml version=\"1.0\"?>
    <RatingServiceSelectionRequest xml:lang=\"en-US\">
        <Request>
            <TransactionReference>
                <CustomerContext>Bare Bones Rate Request</CustomerContext>
                <XpciVersion>1.0001</XpciVersion>
            </TransactionReference>
            <RequestAction>Rate</RequestAction>
            <RequestOption>Rate</RequestOption>
        </Request>
    <PickupType>
        <Code>01</Code>
    </PickupType>
    <Shipment>
        <Shipper>
            <Address>
                <PostalCode>$PostalCode</PostalCode>
                <CountryCode>US</CountryCode>
            </Address>
        <ShipperNumber>$ShipperNumber</ShipperNumber>
        </Shipper>
        <ShipTo>
            <Address>
                <PostalCode>$dest_zip</PostalCode>
                <CountryCode>US</CountryCode>
            <ResidentialAddressIndicator/>
            </Address>
        </ShipTo>
        <ShipFrom>
            <Address>
                <PostalCode>$PostalCode</PostalCode>
                <CountryCode>US</CountryCode>
            </Address>
        </ShipFrom>
        <Service>
            <Code>$service</Code>
        </Service>
        <Package>
            <PackagingType>
                <Code>02</Code>
            </PackagingType>
            <Dimensions>
                <UnitOfMeasurement>
                    <Code>IN</Code>
                </UnitOfMeasurement>
                <Length>$length</Length>
                <Width>$width</Width>
                <Height>$height</Height>
            </Dimensions>
            <PackageWeight>
                <UnitOfMeasurement>
                    <Code>LBS</Code>
                </UnitOfMeasurement>
                <Weight>$weight</Weight>
            </PackageWeight>
        </Package>
    </Shipment>
    </RatingServiceSelectionRequest>";
    $ch = curl_init("https://www.ups.com/ups.app/xml/Rate");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch,CURLOPT_POST,1);
    curl_setopt($ch,CURLOPT_TIMEOUT, 60);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
    $result=curl_exec ($ch);        
   $upsout = (explode('USD', $result, 15));    
    $handling = $upsout[3];
   echo "<br><br>Shipping: $";
    echo $handling; 
   echo " USD<br><br>";       
   curl_close($ch);
   var_dump( $handling);
// print_r ($upsout);}?>

$handling の出力は、常に 00.00 または 000.00 形式の数値であり、ゼロはもちろん数値です。算術関数で機能し、数値として使用するために格納できるようにするには、これが本当に必要です。

私はそれがうまくいかないことを知っています。

$test = $handling *2;
echo $test;

出力として「0」を取得しますが、$handling が何であれ、2 倍ではありません...

編集:

var_dump( htmlentities( $handling)); を実行すると

出力は次のとおりです。

文字列(222) "33.35"

var_dump( $handling); を実行すると

出力は

文字列(168) "33.35"

SO ....この配列エントリからがらくたを解析して、代数的に操作できるようにする方法を見つける必要があります。

4

3 に答える 3

1

あなたの文字列にはHTMLタグが含まれているに違いないので、これが得られますvar_dump():

string(168) "33.35"

最初の数字は、文字列の長さが 168 文字で、33.35最大 5 文字であることを意味します。つまり、数字だけではない別の何かがそこにあるのです。

これらの解決策の 1 つが機能しますが、文字列が実際にどのように見えるか確信が持てないため、多くのアイデアを捨てています。

$haystack0 = strip_tags( $haystack); 
echo '0. ' . $haystack0 * 2; echo "<br />\n";

$haystack1 = trim( strip_tags( $haystack)); 
echo '1. ' . $haystack1 * 2; echo "<br />\n";

preg_match( '/\b(\d+\.\d+)\b/', $haystack, $match);
$haystack2 = $match[1];
echo '2. ' . $haystack2 * 2; echo "<br />\n";

$haystack3 = preg_replace( '/[^\d\.]+/', '', $haystack); 
echo '3. ' . $haystack3 * 2; echo "<br />\n";

編集:実際の文字列は次のとおりです。

string(222) "</CurrencyCode><MonetaryValue>33.35</MonetaryValue></TotalCharges><GuaranteedDaysToDelivery/><ScheduledDeliveryTime/><RatedPackage><TransportationCharges><CurrencyCode>"

それで、それを入れて$haystackXML タグを取り除きます:

$haystack = "</CurrencyCode><MonetaryValue>33.35</MonetaryValue></TotalCharges><GuaranteedDaysToDelivery/><ScheduledDeliveryTime/><RatedPackage><TransportationCharges><CurrencyCode>";
$haystack = strip_tags( $haystack);
var_dump( $haystack);

そして、出力として取得します

 string(5) "33.35"

したがって、これを 2 倍すると、次のようになります

 float(66.7)

問題が解決しました!

于 2012-07-26T21:45:27.400 に答える
0

これをテストしたところ、正常に動作しますが、10 進数の値が失われます。

<?php
$handling = '12.24';

echo intval($handling) * 2; // prints 24
echo floatval($handling) * 2; // prints 24.48

?>

問題を解決するには、 $handling を floatval() 関数でラップする必要があります。

<?php function ups($dest_zip,$service,$weight,$length,$width,$height)
    </RatingServiceSelectionRequest>";
    $ch = curl_init("https://www.ups.com/ups.app/xml/Rate");
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch,CURLOPT_POST,1);
    curl_setopt($ch,CURLOPT_TIMEOUT, 60);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
    $result=curl_exec ($ch);        
    $upsout = (explode('USD', $result, 15));    
    $handling = floatval($upsout[3]);  // <--- recommend wrap here if you need to use variable later in math
    echo "<br><br>Shipping: $";
    echo $handling;
    echo " USD<br><br>";       
    curl_close($ch);
    // print_r ($upsout);}
 ?>
于 2012-07-26T21:03:50.877 に答える
0

編集:これについてもっと考えて、$test を使用したサンプルコードが実際にそのように発生することを確信していますか? 型ジャグリングを使用すると、文字列に数値を掛けて数値を返すことができます。サンプル コードのテスト行を次のように変更するとどうなりますか。

print "handling is $handling \n calculated value is $test"; 

原文:00.00これは UPS から戻ってきた費用のようですが、セントがあるため整数ではない可能性が最も高いです (値が形式である、または000.00これも確認しているように見えるというあなたの言及)。)。

そのため、次のいずれかの方法を使用して、フロートに変換する必要があります。

$test = (float)$handling * 2;
$test2 = floatval($handling) * 2;
于 2012-07-26T21:10:00.280 に答える