php检查数组中的特定值是不是包含大于0的值[重复]

Posted

技术标签:

【中文标题】php检查数组中的特定值是不是包含大于0的值[重复]【英文标题】:php check if a specific value in array contains value bigger than 0 [duplicate]php检查数组中的特定值是否包含大于0的值[重复] 【发布时间】:2020-12-11 20:18:38 【问题描述】:

我对编程(系统管理员)比较陌生,但我的脑袋很疼。我想检查数组或 json 中的值是否大于 0,并根据其值将 $contains 设置为“true”或“false”。

我正在创建一个数组,稍后将其转换为 json:

$fh = fopen("/var/www/path/to/txt/file/". $date . ".txt",'r'); //thats my TXT File
$data = array();

while ($line = fgets($fh)) 
   if(trim($line)!='')
       $line_data = explode(':',$line);
       $data[]=array('item'=>trim($line_data[0]),'value'=>trim($line_data[1]));
   

fclose($fh);

现在我从中删除特定行并将其转换为 json:

$data = \array_diff_key($data, ["Untersuchte Objekte"]); //removed specific line
$json_data = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_NUMERIC_CHECK); // for further use and convert the string value to int

现在我的 json 看起来像:


    "1": 
        "item": "Total items found",
        "value": 0
    ,
    "2": 
        "item": "Infected objects and other objects",
        "value": 0
    ,
    "3": 
        "Item": "Disinfected objects",
        "value": 0
    ,
    "4": 
        "item": "moved to memory",
        "value": 0
    ,
    "5": 
        "item": "distant objects",
        "value": 0
    ,
    "6": 
        "item": "uninfected items",
        "value": 0
    ,
    "7": 
        "item": "examination error",
        "value": 0
    ,
    "8": 
        "item": "Password protected items",
        "value": 0
    ,
    "9": 
        "item": "skipped items",
        "value": 0
    

如果 json 中的“值”之一 > 0,现在我希望 $contains 为“真”。我正在尝试这样做:

$data = array(json_decode($json_data));
$a = array_search('value', array_column($data, 'value'));
if ($a > 0)
  
    $contains = "true";
  
else
  
    $contains = "false";
  

如果 "value" > 0, $contains = "true",我怎样才能做到这一点?

【问题讨论】:

不应该是$a = array_search(0, array_column($data, 'value')); json_decode($json_data) 返回一个对象,而不是数组,使用json_decode($json_data, TRUE) 获取一个数组。 @AyushGupta 是的,该行和来自 user3783243 的行已修复。非常感谢:) @nice_dev 如何选择评论作为答案?我应该把它写下来作为答案吗? 请注意,您的 intersect_diff_key() 无法按预期工作,因为您要求比较键,但您的第二个参数的键是 0 而不是 Untersuchte Objekte。在这里看到它失败了:3v4l.org/LFYO1 也许你只是想unset($data["Untersuchte Objekte"]) 【参考方案1】:

您可以在您的数组上进行迭代,并在您有搜索内容时停止它:

$contains = false;
foreach(json_decode($json_data, true) as $item)
    if ($item['value']) 
        $contains = true;
        break;
    

您可以通过多种方式实现这一目标。但这可以帮助您走得更远。

【讨论】:

【参考方案2】:

在第一次创建数据 JSON 数据时这样做会更快(所以在读取 .txt 文件时)......

$contains = false;
while ($line = fgets($fh)) 
    if(trim($line)!='')
        $line_data = explode(':',$line);
        $data[]=array('item'=>trim($line_data[0]),'value'=>trim($line_data[1]));
        if ($line_data[1] > 0)  
            $contains = true;
        
    

【讨论】:

这可能对“关注点分离”不太友好。您可以使用一项服务来读取您的文件,并使用另一项服务来处理您的数据,不是吗?你怎么看? @S.LT 视情况而定 $contains = true;之后我会建议break,因为一旦找到,就不需要再搜索了。 @MarkusZeller,因为这是加载数据,使用 break 将停止数据加载。如果数据加载的唯一目的是测试这个值,那么它会很好,如果不是,那么它将丢失其余的数据。 在这种情况下,我完全同意。我以为这只是关于检测。【参考方案3】:

您可以使用array_sum 对数组的所有元素求和。如果你得到一个正数,那么就有大于 0 的元素。

$values = array_column($data,'value');
$contains = array_sum($values) > 0;

注意:假设您的 value 永远不会低于零,这将始终有效。

【讨论】:

如果有+1,-1这样的值会报错 @AyushGupta 查看 OP 的数据集,文件数不太可能为 -1。 技术上它们都是无符号值。【参考方案4】:

所以对于解决我的问题的答案,@AyushGupta 和 @user3783243 在我的帖子右侧的评论中提供。

变化

$data = array(json_decode($json_data));
$a = array_search('value', array_column($data, 'value'));
if ($a > 0)
  
    $contains = "true";
  
else
  
    $contains = "false";
  

$data = array(json_decode($json_data, TRUE));
$a = array_search(0, array_column($data, 'value'));
if ($a > 0)
  
    $contains = "true";
  
else
  
    $contains = "false";
  

提供了解决方案,因此 $contains 现在是“真”或“假”。谢谢大家:)

【讨论】:

这完全不正确。让我告诉你,这对你的情况不起作用。它可能返回的数组索引为 0,并且该索引可能大于 0。 array_search 正在搜索值 0,但您想检查是否有任何值大于 0。这是两个完全不同的东西。 嗯,我知道你想去哪里。我明天会调查的。 @nice_dev

以上是关于php检查数组中的特定值是不是包含大于0的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python检查一个值是不是大于数组/向量中的下一个值[重复]

Pyspark:检查数组类型列是不是包含列表中的值[重复]

mongodb:查询以检查数组中的项目是不是包含特定字符串[重复]

有条件地检查数组是不是等于特定值[重复]

大于 x 时替换数组中的值 [重复]

根据数组中的值检查值并使用 PHP 返回键