Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确保PHP变量的最佳方法是数组_Php_Arrays_Php 5.3 - Fatal编程技术网

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

确保PHP变量的最佳方法是数组,php,arrays,php-5.3,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( $a

我有一个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必须发送以数组形式包装的所有记录。

这可能是tbh的最佳方式,如果您不打算强制执行始终发送数组。

这可能是tbh的最佳方式,如果您不打算强制执行始终发送一个数组。

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

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

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

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

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

function Destroy(array $aRecords) { ... }
然后,客户端还应始终发送阵列。如果出于任何原因,这是不可能的,则从客户端接收(非)数组并将其传递给
Destroy()
的代码需要负责将其作为数组传递,因为它是(非兼容)客户端和标准化函数之间的接口

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

// someaction.php

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


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

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

function Destroy(array $aRecords) { ... }
然后,客户端还应始终发送阵列。如果出于任何原因,这是不可能的,则从客户端接收(非)数组并将其传递给
Destroy()
的代码需要负责将其作为数组传递,因为它是(非兼容)客户端和标准化函数之间的接口

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

// someaction.php

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


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

只需将变量键入数组:

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

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

请参见

简单地将变量类型转换为数组:

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

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

请参见

最好的方法是标准化客户端应该发送的内容…:)我完全同意这一点,并考虑修复SQL注入。对于一所学校来说,这是一个封闭的系统,所以不是一个主要的问题。@Izhaki是一项体育运动,不管怎样,它都可以净化输入。过于自信并不能确保你的应用程序安全!最好的方法是标准化客户端应该发送的内容…:)我完全同意这一点,并考虑修复SQL注入。对于一所学校来说,这是一个封闭的系统,所以不是一个主要的问题。@Izhaki是一项体育运动,不管怎样,它都可以净化输入。过于自信并不能确保你的应用程序安全!谢谢你的回复。这是非常有益的。由于我使用的是ExtJS Direct包,并且所有服务器调用都是在一个相当复杂的MVC框架内自动完成的,所以我不希望修补ExtJS,尤其是Direct包。Sencha的人有时有很好的理由来解释他们是如何实施的。我会提供开发人员考虑使呼叫一致。我会接受最适合原问题的答案。不过,非常感谢。谢谢你的回复。这是非常有益的。由于我使用的是ExtJS Direct包,并且所有服务器调用都是在一个相当复杂的MVC框架内自动完成的,所以我不希望修补ExtJS,尤其是Direct包。Sencha的人有时有很好的理由来解释他们是如何实施的。我会提供开发人员考虑使呼叫一致。我会接受最适合原问题的答案。不过,非常感谢。如果它是一个数组的话,那就不起作用了!如果它应该是一个数组的话,那就行不通了!当处理数组或基元类型的变量时,这是一种优雅的方法,但对于对象来说,它将失败得可怕。根据“如果将对象转换为数组,则结果是一个数组,其元素是对象的属性。”此外,
(array)null
是空数组,它可能是您想要的,也可能不是您想要的。当您处理数组或基元类型的变量时,这是一种优雅的方法,但对于对象来说,它将失败得可怕。根据“如果将对象转换为数组,则结果是其元素为对象属性的数组。”此外,
(array)null
是空数组,它可能是您想要的,也可能不是您想要的。