0

PHPについてはよくわかりませんが、通常は数学のようで、角かっこは何よりも先に実行されます。

私はこれを持っています:

if( !strncmp($method_id,'OPTION', 6) && ( ($method_id != 'OPTION_5') || ($method_id != 'OPTION_12') ) )
    unset( $available_methods[ $method_id ] );

ここで、は1から12に$method_id等しいです。OPTION_

事実上、オプション5と12が使用可能な場合は、これら2つを除くすべての設定を解除します。

質問 上記が機能しないのはなぜですか。


編集

単純化してみましたが、わかりづらくなったと思います。

これは配送ループです。使用可能な方法は、、、、、、、、、および[出荷国内であり、国際ship:REGULAR_LOCAL的であるship:EXPRESS_LOCAL場合ship:PLAT_LOCAL]です。ship:REGULAR_INTship:EXPRESS_INTship:PLAT_INTFREE_SHIPPINGLOCALINT

注文が100ドルを超えると、FREE_SHIPPING自動的に開始されますが、顧客の出身地に応じて、どちらかship:EXPRESS_LOCALまたはプレゼントを用意したいと思います。ship:EXPRESS_INT

if( !strncmp($method_id,'ship:', 5) && ( ($method_id != 'ship:EXPRESS_LOCAL') || ($method_id != 'ship:EXPRESS_INT') ) )
    unset( $available_methods[ $method_id ] );

FREE_SHIPPINGこれは、、、またはのいずれかでship:EXPRESS_LOCAL 返さ れますship:EXPRESS_INT

ループ

if( isset( $available_methods['FREE_SHIPPING'] ) ) {
    foreach( $available_methods as $method_id => $method ) {
        if( !strncmp( $method_id, 'ship:', 5 ) && ( ($method_id != 'ship:EXPRESS_LOCAL') && ($method_id != 'ship:EXPRESS_INT') ) )
            unset( $available_methods[ $method_id ] );
    }
}   
return $available_methods;
4

3 に答える 3

4

論理的にナンセンスです。またはの2番目の部分を見てください。method_idが5でない場合、またはmethod_idが12でない場合。まあ、それが5または12以外の場合は、それからtrueが得られます。5の場合、trueである「falseまたはtrue」を取得します。12の場合、「trueまたはfalse」が得られます。これはtrueです。したがって、後半全体は常に真実です。おそらくあなたは||の代わりに&&を意味しました または、!=の代わりに==が必要です。

于 2013-03-20T01:44:59.203 に答える
1

通常は、コードをフォーマットして、より明確に表示することをお勧めします。

から:

if( !strncmp($method_id,'OPTION', 6) && ( ($method_id != 'OPTION_5') || ($method_id != 'OPTION_12') ) )

に:

if(

  !strncmp($method_id,'OPTION', 6)

  &&

  ( 
      ($method_id != 'OPTION_5')
      ||
      ($method_id != 'OPTION_12') 
  ) 

)

この部分は常に真実です:

  ($method_id != 'OPTION_5')
  ||
  ($method_id != 'OPTION_12') 

それらの1つは常に真であるため、そしてtrue || false === false || true === true

したがって、ifは真のiff!strncmp($method_id,'OPTION', 6) === trueであり、意味しstrncmp($method_id,'OPTION', 6)===falseます。

使用するロジックを確認してください。

于 2013-03-20T01:45:52.477 に答える
0

更新された質問には、すでに正しいコードが含まれている必要があります。これは私がそれを書いた方法です:

$localOrInt = array('ship:EXPRESS_LOCAL', 'ship:EXPRESS_INT');

if (isset($available_methods['FREE_SHIPPING'])) {
    foreach ($available_methods as $method_id => $method) {
        if (!strncmp($method_id, 'ship:', 5) && !in_array($method_id, $localOrInt)) {
            unset($available_methods[$method_id]);
        }
    }
}
于 2013-03-20T02:13:21.547 に答える