Различить неизвестный остаток, пустую подпись и ноль

Фактические данные получены через расширение interbase от отдельной локальной базы Firebird. Собственная учебная таблица удалена после наблюдений.

Наблюдаемый результат программы
НаблюдениеРезультат
Ключи первой строкиid, title, note, qty
Карточка 1Датчик: остаток неизвестен; подпись: не заполнена
Карточка 2Крепление: нет в наличии; подпись: пустая строка
Карточка 3Кабель: в наличии: 5; подпись: Проверено
Ключ qty существует у первой строкида
isset(qty) у первой строкинет
Строки и дополнительные наблюдения
{
    "source_rows": [
        {
            "id": 1,
            "title": "Датчик",
            "note": null,
            "qty": null
        },
        {
            "id": 2,
            "title": "Крепление",
            "note": "",
            "qty": 0
        },
        {
            "id": 3,
            "title": "Кабель",
            "note": "Проверено",
            "qty": 5
        }
    ],
    "visible_cards": [
        "Датчик: остаток неизвестен; подпись: не заполнена",
        "Крепление: нет в наличии; подпись: пустая строка",
        "Кабель: в наличии: 5; подпись: Проверено"
    ]
}

Самостоятельный запуск создаёт result.json с данными и metrics.json с проверками рядом с example.php.