如果数组为空,如何将其从json_encode中排除?(PHP)


If array is empty how do I exclude it from json_encode? (PHP)

我正在使用以下PHP构建json子数组结构(来自CSV(:

$tracks = array();
foreach ($result['tracks'] as $trackdata) {
    $songId    = $trackdata['songId'];
    $title     = $trackdata['title'];
    $ISRC      = $trackdata['ISRC'];
    $name1     = $trackdata['artists:name[1]'];
    $name2     = $trackdata['artists:name[2]'];
    $main1     = $trackdata['artists:main[1]'];
    $main2     = $trackdata['artists:main[2]'];
    $tracks['tracks'][] = array(
        'songId' => $songId,
        'title' => $title,
        'ISRC' => $ISRC,
        'artists' => array(
            0 => array(
                'name' => $name1,
                'main' => (boolean) $main1
            ),
            1 => array(
                'name' => $name2,
                'main' => (boolean) $main2
            )
        )
    );
}

目前,如果CSV包含空值,json(正确地(会将该值显示为NULL。

如果一个特定的对象的值为空/空白,我需要在PHP中添加什么来阻止它成为json的一部分?

如果CSV数据中不存在第二位艺术家,我特别希望不打印艺术家:名称[2]画家:主[2]

以下是CSV代码的示例:

"trk-04","track 4","USAM18490006","John Smith",true,,

我已经研究过(并试图实现(if(empty…但我不确定这段代码会出现在哪里。

任何指针都会很棒。

提前感谢!

您需要避免将第二个艺术家添加到随后进行json编码的中间数组中。

$tracks = array();
foreach ($result['tracks'] as $trackdata) {
    $songId    = $trackdata['songId'];
    $title     = $trackdata['title'];
    $ISRC      = $trackdata['ISRC'];
    $name1     = $trackdata['artists:name[1]'];
    $name2     = $trackdata['artists:name[2]'];
    $main1     = $trackdata['artists:main[1]'];
    $main2     = $trackdata['artists:main[2]'];
    $artists = array();
    // First artist always exists
    $artists[] = array('name' => $name1, 'main' => (boolean) $main1);
    // Add second artist only if one exists with a non-null name
    if(!is_null($name2)) {
      $artists[] = array('name' => $name2, 'main' => (boolean) $main2);
    }
    $tracks['tracks'][] = array(
        'songId' => $songId,
        'title' => $title,
        'ISRC' => $ISRC,
        'artists' => $artists
    );
}

如果您愿意,可以使用empty函数而不是is_null。它将认为诸如空字符串和数字0之类的名称不存在。is_null将只捕获那些严格地===为空的。

如下:

if (!empty($songId))
{
    $tracks['tracks']['songId'] = $songId;
}
if (!empty($title))
{
    $tracks['tracks']['title'] = $title;
}
and so on ...
$artists[0] = array(
            'name' => $name1,
            'main' => (boolean) $main1
        );
if (!empty($name2)&&!empty($main2))
    $artists[1] = array(
            'name' => $name2,
            'main' => (boolean) $main2
        );
$tracks['tracks'][] = array(
    'songId' => $songId,
    'title' => $title,
    'ISRC' => $ISRC,
    'artists' => $artists
);

使用array_filter从数组中筛选出未设置的日期

 // assuming $artist is an array you want to scrub
 $artist = array_filter($artist);
 $track["artists"][] = $artist;
if (  ( ! isset( artists:name[2] ))
   || ( empty( artists:name[2] ))
   )  {
  unset( $tracks['tracks'][ 'artists' ][ 1 ] );
}

更好的

$n = 0;
while( ! empty( $trackdata[ 'artists:name[' . $n+1 . ']' ] )) {
   $tracks['tracks'][ 'artists' ][ $n ][ 'name' ] 
       = $trackdata[ 'artists:name[' . $n+1 . ']' ];
   $tracks['tracks'][ 'artists' ][ $n ][ 'main' ] 
       = $trackdata[ 'artists:main[' . $n+1 . ']' ];
  $n++;
}