确保PHP变量的最佳方法是数组

时间:2012-06-26 11:36:53

标签: php arrays php-5.3

我有一个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有an option来发送包含在数组中的所有记录。

4 个答案:

答案 0 :(得分:5)

您可以尝试以下操作,而不是功能:

$aRecords = is_array($aRecords) ? $aRecords : array($aRecords);

答案 1 :(得分:0)

这可能是最好的方式,如果你不强制执行你总是被发送一个数组。

答案 2 :(得分:0)

我会将函数Destroy要求数组作为参数:

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

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

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

// 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));

如果客户端不同地向同一操作发送不同格式,请修复客户端。

答案 3 :(得分:-1)

只需将变量强制转换为数组:

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