相同的计数数组代码,给出不同的结果

时间:2016-02-18 20:25:41

标签: php soap multidimensional-array

我很难理解为什么数组计数输出的结果没有任何意义。我有以下代码来计算数组项

echo $arrayLength = count($result['GetRecentCasesResult']['CaseHistory'])

现在,当数组包含以下内容时:

Array ( 
        [caseNumber] => CAS-00477-Z7Z9N6 
        [dateCreated] => 18-02-2016 21:58
        [faultType] => Cable theft notification 
        [status] => Open [lastStatusChange] => Un-known 
       )

我得到上述数组的计数结果为5 但是对于以下数组,我得到了2的计数:

Array ( [0] => Array ( [caseNumber] => CAS-00475-H3Z4W4 
                       [dateCreated] => 18-02-2016 21:22 
                       [faultType] => Electricity outage - Business
                       [status] => Open 
                       [lastStatusChange] => Un-known 
                     ) 

        [1] => Array ( [caseNumber] => CAS-00476-F2N7H4 
                       [dateCreated] => 18-02-2016 21:22 
                       [faultType] => Electricity outage - Business 
                       [status] => Open 
                       [lastStatusChange] => Un-known ) 
                     )

我意识到当有多个项目时,数组的显示方式与两个或更多项目时的显示方式不同。有没有办法可以规范计数?

两个Array结果都来自SOAP API结果集

3 个答案:

答案 0 :(得分:0)

你的第二个结果是计算外部数组,即数组数组。

迭代数组并每次计算值数组。需要一个例子吗?

services.Configure<CookieAuthenticationOptions>(options =>
{
    options.AutomaticAuthenticate = true;
    options.LoginPath = new PathString("/Content/Index");
    options.LogoutPath = new PathString("/Content/Index");
});

答案 1 :(得分:0)

count返回顶级数组中的项目数,因此您看到的行为是正确的。

似乎潜在的问题是你正在处理的是当有多个结果时你得到一系列结果。如果只有一个结果,你就可以得到那个结果。

您可以通过检查是否设置了特定键来测试:

if(isset($result['GetRecentCasesResult']['CaseHistory']['caseNumber'])) {
    // Single result
} else {
    // Multiple results
}

您还可以规范化响应,以便您可以采用相同的方式处理响应,无论它们是否为多个结果:

if(isset($result['GetRecentCasesResult']['CaseHistory']['caseNumber'])) {
    $result['GetRecentCasesResult']['CaseHistory'] = [ $result['GetRecentCasesResult']['CaseHistory'] ];
}

以上将确保您始终拥有一系列结果。

答案 2 :(得分:0)

函数count只计算数组中的项目。

这里 - 您有5个项目:

Array ( 
    [caseNumber] => CAS-00477-Z7Z9N6           // 1st
    [dateCreated] => 18-02-2016 21:58          // 2bd
    [faultType] => Cable theft notification    // 3rd
    [status] => Open                           // 4th
    [lastStatusChange] => Un-known             // 5th
)

而这里 - 只有两个:

Array ( 
    // FIRST
    [0] => Array ( [caseNumber] => CAS-00475-H3Z4W4 
                   [dateCreated] => 18-02-2016 21:22 
                   [faultType] => Electricity outage - Business
                   [status] => Open 
                   [lastStatusChange] => Un-known 
                 ) 
    // SECOND
    [1] => Array ( [caseNumber] => CAS-00476-F2N7H4 
                   [dateCreated] => 18-02-2016 21:22 
                   [faultType] => Electricity outage - Business 
                   [status] => Open 
                   [lastStatusChange] => Un-known ) 
                 )
)

通常情况下,count不计算子数组中的项目,但您可以将1(或COUNT_RECURSIVE)作为第二个参数传递给count并获取12作为第二个数组的结果。

因此,您可以通过检查数组中是否有caseNumber键来解决您的问题。如果不是 - 你应该迭代子阵列。 或者,您可以count具有第二个参数的项目,没有它。它的值是不同的 - 你应该迭代子阵列。

最合适的解决方案 - 是修复SOAP提供程序(如果可以的话),因此它将始终返回数组数组。