1

サーバー関数にパラメーターを渡すjavascriptクライアントがあります(ExtJS Directを使用しています)。クライアントが単一のオブジェクトを送信する場合もあれば、オブジェクトの配列を送信する場合もあります。

現在、このEnsureArray関数を使用して、パラメーターが配列であることを確認してから、次のことを行いますforeach

// Wraps a non array variable with an array.
function EnsureArray( &$aVar )
{
    if ( !is_array( $aVar ) )
        $var = array( $aVar );
}

function Destroy( $aRecords )
{
    // $aRecords might be a single object or an array of objects. Ensure it's wrapped as an array.        
    $this->EnsureArray( $aRecords );

    foreach ( $aRecords as $aRecord )
    {
        sql( "UPDATE Groups SET deleted = true WHERE id = $aRecord->id LIMIT 1" );
    }        

    return array(
        'success' => true,
    );
}   

同じことを行うことができるトリック、きちんとした方法、1つのラインはありますか?

編集:この質問を投稿してから、ExtJSには配列にラップされたすべてのレコードを送信するオプションがあることがわかりました。

4

4 に答える 4

5

関数の代わりに、次のことを試すことができます。

$aRecords = is_array($aRecords) ? $aRecords : array($aRecords);
于 2012-06-26T13:33:21.527 に答える
0

Destroy関数にパラメーターとして配列を要求させるようにします。

function Destroy(array $aRecords) { ... }

その場合、クライアントは常にアレイを送信する必要があります。何らかの理由でそれが不可能な場合、クライアントから(非)配列を受け取り、それを渡すコードは、Destroy()配列として渡す責任を負う必要があります。これは、(非準拠)クライアントと標準化された機能。

クライアントが呼び出すことができるアクションごとに1つのエンドポイントが存在する可能性があるため、データが配列であるかどうかを判断する必要はありません。すなわち:

// someaction.php

include 'destroy.php';
$data = json_decode($_POST['data']);
Destroy($data);

しかし:

// anotheraction.php

include 'destroy.php';
$data = json_decode($_POST['data']);
Destroy(array($data));

クライアントが同じアクションに異なる形式を不規則に送信する場合は、クライアントを修正してください。

于 2012-06-26T13:44:07.433 に答える
0

常に配列が送信されることを強制しない場合は、これがおそらく最良の方法です。

于 2012-06-26T11:39:18.683 に答える
0

変数を配列に型キャストするだけです。

function Destroy( $aRecords )
{
    foreach ( (array)$aRecords as $aRecord )
    {
        sql( "UPDATE Groups SET deleted = true WHERE id = $aRecord->id LIMIT 1" );
    }        

    return array(
       'success' => true,
    );
}   

http://php.net/manual/en/language.types.type-juggling.phpを参照してください

于 2014-10-04T01:22:45.973 に答える