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检查一个值是不是大于数组/向量中的下一个值[重复]