【问题标题】:How to tell if an array has more than one array in the subarray如何判断一个数组的子数组中是否有多个数组
【发布时间】:2020-05-16 13:37:56
【问题描述】:

我有以下带有子数组 [0] 到 [9] 的数组。我想测试数组,看看是否有一个子数组或多个子数组。为什么?因为有时我会从某些表中取回一条记录,我必须能够判断是否可以按原样保存它,还是应该使用 foreach 来保存它。我正在构建一个 if-then 语句来确定一个记录然后执行 x 或者是否有两个或更多然后执行 y 并使用 foreach 方法。我还没有能够隔离子数组并正确计算它们来做出这个决定。任何帮助,将不胜感激。所需要的只是如何测试一种或多种。谢谢。注意:我使用的是 php 版本 7.2.7

Array ( [ReceiptsGetInfoResult] => Array ( [ReceiptObject] => Array ( [0] => Array ( [Deposit_ID] => 0 [Receipt_ID] => 2777 [Account_ID] => 4555100000010792 [ClientID] => 1127 [DateReceived] => 2019-01-07T16:22:46.927 [DateEntered] => 2019-01-07T16:23:00 [Deposit_Amount] => 1.0000 [Deposit_Type] => C [DRC_ClientID] => 1196 [HoldDate] => [CCDeposit_ID] => 35 [DRC_TransactionID] => 0 ) [1] => Array ( [Deposit_ID] => 0 [Receipt_ID] => 2779 [Account_ID] => 4555100000010792 [ClientID] => 1127 [DateReceived] => 2019-01-30T10:48:35.55 [DateEntered] => 2019-01-30T10:49:00 [Deposit_Amount] => 1.0000 [Deposit_Type] => C [DRC_ClientID] => 1196 [HoldDate] => [CCDeposit_ID] => 36 [DRC_TransactionID] => 0 ) [2] => Array ( [Deposit_ID] => 0 [Receipt_ID] => 2781 [Account_ID] => 2222100000010717 [ClientID] => 1141 [DateReceived] => 2019-08-08T00:00:00 [DateEntered] => 2019-08-08T14:09:00 [Deposit_Amount] => 100.0000 [Deposit_Type] => A [DRC_ClientID] => 2222 [HoldDate] => [CCDeposit_ID] => 0 [DRC_TransactionID] => ) [3] => Array ( [Deposit_ID] => 313 [Receipt_ID] => 2782 [Account_ID] => 2222100000010717 [ClientID] => 1141 [DateReceived] => 2019-08-09T00:00:00 [DateEntered] => 2019-08-09T11:32:00 [Deposit_Amount] => 195.0000 [Deposit_Type] => A [DRC_ClientID] => 2222 [HoldDate] => [CCDeposit_ID] => 0 [DRC_TransactionID] => 8 ) [4] => Array ( [Deposit_ID] => 315 [Receipt_ID] => 2783 [Account_ID] => 2222100000010717 [ClientID] => 1141 [DateReceived] => 2019-08-09T00:00:00 [DateEntered] => 2019-08-09T11:32:00 [Deposit_Amount] => 210.0000 [Deposit_Type] => A [DRC_ClientID] => 2222 [HoldDate] => [CCDeposit_ID] => 0 [DRC_TransactionID] => 9 ) [5] => Array ( [Deposit_ID] => 0 [Receipt_ID] => 2785 [Account_ID] => `enter code here`2222100000010717 [ClientID] => 1141 [DateReceived] => 2019-10-03T00:00:00 [DateEntered] => 2019-10-03T11:51:00 [Deposit_Amount] => 19.0000 [Deposit_Type] => A [DRC_ClientID] => 2222 [HoldDate] => [CCDeposit_ID] => 0 [DRC_TransactionID] => ) [6] => Array ( [Deposit_ID] => 0 [Receipt_ID] => 2787 [Account_ID] => 2222100000010717 [ClientID] => 1141 [DateReceived] => 2019-09-28T00:00:00 [DateEntered] => 2019-10-03T11:52:00 [Deposit_Amount] => 28.0000 [Deposit_Type] => A [DRC_ClientID] => 2222 [HoldDate] => 2019-09-28T00:00:00 [CCDeposit_ID] => 0 [DRC_TransactionID] => ) [7] => Array ( [Deposit_ID] => 0 [Receipt_ID] => 2788 [Account_ID] => 2222100000010717 [ClientID] => 1141 [DateReceived] => 2019-09-29T00:00:00 [DateEntered] => 2019-10-03T11:52:00 [Deposit_Amount] => 29.0000 [Deposit_Type] => A [DRC_ClientID] => 2222 [HoldDate] => 2019-09-29T00:00:00 [CCDeposit_ID] => 0 [DRC_TransactionID] => ) [8] => Array ( [Deposit_ID] => 0 [Receipt_ID] => 2789 [Account_ID] => 2222100000010717 [ClientID] => 1141 [DateReceived] => 2019-09-30T00:00:00 [DateEntered] => 2019-10-03T11:53:00 [Deposit_Amount] => 30.0000 [Deposit_Type] => A [DRC_ClientID] => 2222 [HoldDate] => [CCDeposit_ID] => 0 [DRC_TransactionID] => ) [9] => Array ( [Deposit_ID] => 417 [Receipt_ID] => 2791 [Account_ID] => 2222100000010717 [ClientID] => 1141 [DateReceived] => 2020-01-16T00:00:00 [DateEntered] => 2020-01-16T11:15:00 [Deposit_Amount] => 130.0000 [Deposit_Type] => A [DRC_ClientID] => 2222 [HoldDate] => [CCDeposit_ID] => 0 [DRC_TransactionID] => 7 ) ) ) )

自 2020 年 2 月 11 日起新增

这是数组键

$array = Array($DepositsGetInfoArray);
print_r(array_keys($array));

数组 ( [0] => 0 )

注意:单个记录没有与之关联的索引,并且来自任何表的任何单个记录都会出现这种情况 -

 $arrDepositObjects = $DepositsGetInfoArray['DepositsGetInfoResult']['DepositObject'];   

Array ( [DepositsGetInfoResult] => Array ( [DepositObject] => Array ( [Deposit_ID] => 315 [Account_ID] => 2222100000010717 [Deposit_Type] => A [Check_Date] => 2019-08-09T00:00:00 [Check_Number] => 2783 [Deposit_Amount] => 210.00 [Deposit_Status] => NSF [NSF_Reason] => INSUF FUNDS [NSF_Date] => 2019-08-09T11:33:46.397 [NSF_Code] => R01 [Creation_Date] => 2019-08-09T11:32:00 [DRC_ClientID] => 2222 [DRC_TransactionID] => 9 ) ) ) 

注意:正如 Abra 建议的那样,它可能会将其视为字符串。所以我仍然无法区分一个记录和多个记录。但挑战依然存在——如何做到这一点。以下是一些提示:

这将返回“假”

echo 'TESTING IF COUNT :';
if (count($arrDepositObjects['DepositsGetInfoResult']['DepositObject']) === 1){
    echo '{"yes, its equal to one":"true"}';
} else {
    echo '{"undetermined":"false"}';
}

还有这个

    echo "<hr>";
function is_assoc($arrDepositObjects)
{
        return is_array($arrDepositObjects) && array_diff_key($arrDepositObjects,array_keys(array_keys($arrDepositObjects)));
}

function test($var)
{
        echo is_assoc($arrDepositObjects) ? "I'm an assoc array.\n" : "I'm not an assoc array.\n";
}

不幸的是没有做任何事情。再次感谢您提供的任何帮助...谢谢。

【问题讨论】:

  • 可能已回答here...?至少可以为您指明如何检查数组深度的正确方向。
  • @KamaranL:根据他们的要求和他们的例子,这太过分了。
  • @Dak 在 Stackoverflow 上发帖时,请始终将您的对象/数组数据显示为 echo "&lt;pre&gt;"; var_export($yourArray);。当前布局有很多水平滚动。另外,数据如何变化?目标子数组有时不是数组吗?如果它总是一个数组,只需使用@Abra 解释的循环。

标签: php arrays count sub-array


【解决方案1】:

你可以申请count(),做你想做的事:

$array = ["ReceiptsGetInfoResult" => ["ReceiptObject" => [["ClientID"=>122],["ClientID"=>123],["ClientID"=>124],]]];

if (count($array["ReceiptsGetInfoResult"]["ReceiptObject"]) === 1){
    // code for case X
} else if (count($array["ReceiptsGetInfoResult"]["ReceiptObject"]) > 1){
    // code for case Y 
}

【讨论】:

  • 为什么是elseif 而不仅仅是&gt; 1else
  • @AbraCadaver,OP 肯定说 1 和超过 1。顺便说一句,您的 in_array 将始终是一个数组。
  • 你正在计算数组中的一个元素,而不是计算数组
  • does this answer your questions,“程序员”?
  • 这在测试单个记录时产生错误:echo 'TESTING IF COUNT :'; if (count($arrDepositObjects['DepositsGetInfoResult']['DepositObject']) === 1){ echo '{"是的,它等于一":"true"}'; } 其他 { 回声'{“未确定”:“假”}'; }
【解决方案2】:

整数索引子数组在['ReceiptsGetInfoResult']['ReceiptObject'] 下,所以只需数一下:

$count = count($array['ReceiptsGetInfoResult']['ReceiptObject']);

但实际上foreach 可以使用一个数组元素,它只会循环一次。有什么问题?

如果它可能根本不是一个数组,请检查它:

if(is_array($array['ReceiptsGetInfoResult']['ReceiptObject'])) {
    //foreach
} else {
    //don't foreach
}

【讨论】:

  • is_array 将永远为真 -> 无用 else。 OP 说 我正在构建一个 if-then 语句来确定一个记录然后执行 x 或者如果有两个或更多则执行 y 并使用 foreach 方法
  • 我发现了一个异常,但我不知道它为什么会发生。当一个记录存在时,它会分散数据。它想从每个字段中绘制一个字符并保存该字符。然而,它适用于多条记录的循环。插入 tblNSF(Deposit_ID、Account_ID、Deposit_Type、Check_Date、Check_Number、Deposit_Amount、Deposit_Status、NSF_Reason、NSF_Date、NSF_Code、Creation_Date、DRC_ClientID、DRC_TransactionID)值(''、''、''、''、''、''、 '', '', '', '', '', '','') 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 A A A A A A A A A A A A A
  • 因为当有一个记录时,它不是一个数组,而是一个字符串,但是您正在循环可能会循环字符串中的字符。您需要在问题中显示两种类型的数组之间的区别。
【解决方案3】:

所有解决方案都会起作用

if (sizeof($array) > 1) {
    //do what ever you want
}else{
    //do what ever you want
}

详情:https://www.php.net/manual/en/function.sizeof.php

或者

if (count($array) > 1) {
    //do what ever you want
}else{
    //do what ever you want
}

计数和更多有用的功能:https://www.php.net/manual/en/function.array-count-values.php

或者

这将检查数组中的元素是否为数组

if(is_array($array['ReceiptsGetInfoResult']['ReceiptObject'])) {
   // This element is an array
}

详情:https://www.php.net/manual/en/function.is-array.php

【讨论】:

  • 我在类似的对象上运行了这个,得到了一个错误的响应: if(is_array($arrDepositObjects['DepositsGetInfoResult']['DepositObject'])) { // 这个元素是一个数组 echo '{ "是的,它是一个数组":"true"}'; } else { echo '{"不,它不是数组":"false"}'; }
  • 然后我运行了 if (count($array) > 1) { ... 它显示为 true。从对象的角度来看,这里如何得到两个不同的答案?后台发生了什么?
  • 查看给定的链接,例如我在移动设备上,您可以使用 var_dumb() 或 print_r() 返回数组,或者如果它为 true,则直接回显这是一个数组。该代码检查数组中的元素是否是另一个数组。请参阅每个解决方案的答案中的给定链接。
  • 检查这个链接而不是给定的 Count url:php.net/manual/en/function.count.php 给定的 url 答案是用于替代函数用于相同的计数结果
  • 查看这个快速示例,了解我在移动设备上创建的数组:3v4l.org/iLYCf
猜你喜欢
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 2020-01-22
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多