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,
    );
}   

有没有一种技巧,更简洁的方法,一条线可以做到这一点?

编辑:自从发布这个问题以来,我发现 ExtJS 可以选择发送包含在数组中的所有记录。

4

4 回答 4

5

您可以尝试以下操作,而不是函数:

$aRecords = is_array($aRecords) ? $aRecords : array($aRecords);
于 2012-06-26T13:33:21.527 回答
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 回答
0

我将使该函数Destroy需要数组作为其参数:

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

然后客户端也应该总是发送数组。如果由于某种原因这是不可能的,那么从客户端接收(非)数组并将其传递给的代码Destroy()需要负责将其作为数组传递,因为它是 (不合规)客户端和标准化功能。

对于客户端可以调用的每个可能的操作,可能会有一个端点,因此您甚至不需要弄清楚数据是否是数组,您只需知道。IE:

// 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 回答