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