在PHP中隐藏类变量,因此它不会显示在JSON输出中

时间:2013-07-05 19:51:19

标签: php json

如果我在PHP 5.5中有这个代码/类,那么我将把它放在一个JSON数组中:

# Define the class
class Equip {
  public $var1 = null;
  public $var2 = null;
}

# For debugging purpose only - specify what should be shown
$show_var1 = false;
$show_var2 = true;

while loop ...

  # Initialize a new class member
  $equip = new Equip();

  # Only populate the variable if it should be shown
  if($show_var1) {
    $equip->var1 = $var1;
  }

  # Only populate the variable if it should be shown
  if($show_var2) {
    $equip->var2 = $var2;
  }

  # Populate the JSON array
  $jsonArr[] = $equip;

end while ...

# Output the JSON encoded array
echo json_encode($jsonArr, JSON_PRETTY_PRINT | JSON_NUMERIC_CHECK);

它将导致此输出(其中 var1 始终为NULL):

[
  {
    "var1": null,
    "var2": 656978
},
{
    "var1": null,
    "var2": 136981
}
]

如何隐藏 var1 变量以获取JSON输出?

2 个答案:

答案 0 :(得分:4)

查看JsonSerializable界面,可在PHP> = 5.4中找到。

如果您将类实现JsonSerializable,则可以实现jsonSerialize()方法以仅返回应编码的数据。

class Equip implements JsonSerializable {
    public $var1 = null;
    public $var2 = null;
    public function jsonSerialize() {
        $out = array();
        if (!is_null($this->var1)) $out['var1'] = $this->var1;
        if (!is_null($this->var2)) $out['var2'] = $this->var2;
        return $out;
    }
}

答案 1 :(得分:0)

一种方法是使用array_filter()删除NULL或false元素。这应该有效:

# Populate the JSON array
$jsonArr[] = array_filter($equip);

有关详细信息,请参阅array_filter() documentation。请记住,如果没有传入回调,则会删除任何计算结果为FALSE的内容,因此如果您计划在$ var1或$ var2中存储布尔值,则此解决方案将无效。

注意:我认为@ jcsanyi的解决方案是最好的,但我认为这可能是最简单的方法来解决它。