如何计算JSON对象中存在的元素数量?

问题描述

我有一个如下所示的PHP / JSON。

JSON:

{"posts_id_en":"101,102,103","posts_id_fr":"","reports_id_en":"101,102","reports_id_fr":"101"}

PHP代码

echo count(explode(",",$data->posts_id_en));    //  Line A  (3)

echo count(explode(",$data->posts_id_fr));    // Line B   (1)

echo count(explode(",$data->reports_id_en));    // Line C  (2)

echo count(explode(",$data->reports_id_fr));    // Line D  (1)

A行PHP代码,C行PHP代码和D行PHP代码分别打印321

问题陈述:

我想知道我需要在上面的B行的PHP代码中进行哪些更改,以便在posts_id_fr中没有元素的情况下将其打印为0

解决方法

您只需要确保该数组内没有空值即可。因为当空字符串爆炸时,它将创建一个值为空的元素。

使用OUTPUT: Before Insertion: 4,5 After Insertion: 4,2,5,7

删除这些值
array_filter

以防万一,您想按照echo count(array_filter(explode(",",$data->posts_id_fr))); // Will print 0 的建议进行遍历

GrumpyCrouton
,

在尝试使用该值之前,您必须检查该值是否已设置

$str = '{"posts_id_en":"101,102,103","posts_id_fr":"","reports_id_en":"101,102","reports_id_fr":"101"}';

$obj = json_decode($str);

foreach ( $obj as $o=>$v) {
    echo $o . ' ';
    echo strlen($v) > 0 ? count(explode(",$v)) : 0 ;
    echo PHP_EOL;
}

结果

posts_id_en 3
posts_id_fr 0
reports_id_en 2
reports_id_fr 1
,

此处略有变化,您可以使用preg_split并使用标志来忽略空拆分。在这里,我们将数字拆分。

<?php

$str = '{"posts_id_en":"101,"reports_id_fr":"101"}';
$arr = json_decode($str,true);

$arr = array_map(function($item) {
    $nums = preg_split('/[^0-9]/',$item,-1,PREG_SPLIT_NO_EMPTY);

    return $nums;
},$arr);

var_export($arr);

$arr = array_map('count',$arr);

var_export($arr);

输出:

array (
  'posts_id_en' => 
  array (
    0 => '101',1 => '102',2 => '103',),'posts_id_fr' => 
  array (
  ),'reports_id_en' => 
  array (
    0 => '101','reports_id_fr' => 
  array (
    0 => '101',)array (
  'posts_id_en' => 3,'posts_id_fr' => 0,'reports_id_en' => 2,'reports_id_fr' => 1,)

其中包括中间步骤,因此您可以看到preg_split的结果。

,
echo count(preg_split("/,/",$data->posts_id_fr,PREG_SPLIT_NO_EMPTY)); 

enter image description here