【问题标题】:What's the best way to count the number of occurrences in this json string in PHP在PHP中计算此json字符串中出现次数的最佳方法是什么
【发布时间】:2022-09-22 23:23:49
【问题描述】:

当我通过他们的 API 在 Stripe 请求发票金额时,我会返回所有数据。所以我需要自己计算发票的数量。

这是我返回的 JSON 数据:

{
  \"object\": \"list\",
  \"data\": [
    {
      \"id\": \"in_0LkpzOCKEf7***t2FwMlp5kQ\",
      \"object\": \"invoice\",
      \"account_country\": \"NL\",
      \"account_name\": \"My Business Inc.\",
      \"account_tax_ids\": null,
      \"amount_due\": 3700,
      \"amount_paid\": 3700,
      \"amount_remaining\": 0,
      \"application\": null,
      \"application_fee\": null,
      \"attempt_count\": 1,
      \"attempted\": true,
      \"auto_advance\": false,
      \"automatic_tax\": {
        \"enabled\": false,
        \"status\": null
      },
      \"billing\": \"charge_automatically\",
      \"billing_reason\": \"subscription_cycle\",
      \"charge\": \"ch_2Lkq37CKEf***bt21g0bkJVa\",
      \"closed\": true,
      \"collection_method\": \"charge_automatically\",
      \"created\": 1666436458,
      \"currency\": \"usd\",
      \"custom_fields\": null,
      \"customer\": \"cus_MTkibG***56Uz4\",
      \"customer_address\": {
        \"city\": \"\",
        \"country\": \"US\",
        \"line1\": \"\",
        \"line2\": \"\",
        \"postal_code\": \"\",
        \"state\": \"\"
      },
      \"customer_email\": \"test1@***.net\",
      \"customer_name\": \"Test\",
      \"customer_phone\": null,
      \"customer_shipping\": null,
      \"customer_tax_exempt\": \"none\",
      \"customer_tax_ids\": [],
      \"date\": 1666436458,
      \"default_payment_method\": null,
      \"default_source\": null,
      \"default_tax_rates\": [],
      \"description\": null,
      \"discount\": null,
      \"discounts\": [],
      \"due_date\": null,
      \"ending_balance\": 0,
      \"finalized_at\": 1666440058,
      \"footer\": null,
      \"forgiven\": false,
      \"from_invoice\": null,
      \"hosted_invoice_url\": \"https://invoice.stripe.com/i/acct_1mMtCKEf7b***2BIJNR2/test_YWNjdF8xbU10Q0t***diTmJ0MkJJSk5SMixfTVRuYWhHcUd5YkNrdkFrSWJTU1BrTFFqWFNLa2NpUiw1NDM5ODkwNw0200PuDmVCv2?s=ap\",
      \"invoice_pdf\": \"https://pay.stripe.com/invoice/acct_1mMtCKEf7bNbt2BI***/test_YWNjdF8xbU10Q0tFZjdiTmJ0MkJJSk5SMixfTVRuYWhHcUd5YkNrdkFrSWJTU1BrTFFqWFNLa2NpUiw1NDM5ODkwNw***0PuDmVCv2/pdf?s=ap\",
      \"last_finalization_error\": null,
      \"latest_revision\": null,
      \"lines\": {
        \"object\": \"list\",
        \"data\": [
          {
            \"id\": \"sub_0LknEJCKEf7bN***bblGV2Lb\",
            \"object\": \"line_item\",
            \"amount\": 3700,
            \"amount_excluding_tax\": 3700,
            \"currency\": \"usd\",
            \"description\": null,
            \"discount_amounts\": [],
            \"discountable\": true,
            \"discounts\": [],
            \"livemode\": false,
            \"metadata\": {},
            \"period\": {
              \"end\": 1669114858,
              \"start\": 1666436458
            },
            \"plan\": {
              \"id\": \"plan_MTjYr***qiEqvG\",
              \"object\": \"plan\",
              \"active\": true,
              \"aggregate_usage\": null,
              \"amount\": 3700,
              \"amount_decimal\": \"3700\",
              \"billing_scheme\": \"per_unit\",
              \"created\": 1663840359,
              \"currency\": \"usd\",
              \"interval\": \"month\",
              \"interval_count\": 1,
              \"livemode\": false,
              \"metadata\": {},
              \"name\": \"PrimaJust Basic - Normal (normal)\",
              \"nickname\": null,
              \"product\": \"prod_MTjYz***ireFSm\",
              \"statement_descriptor\": null,
              \"tiers\": null,
              \"tiers_mode\": null,
              \"transform_usage\": null,
              \"trial_period_days\": null,
              \"usage_type\": \"licensed\"
            },
            \"price\": {
              \"id\": \"plan_MTjYri****EqvG\",
              \"object\": \"price\",
              \"active\": true,
              \"billing_scheme\": \"per_unit\",
              \"created\": 1663840359,
              \"currency\": \"usd\",
              \"custom_unit_amount\": null,
              \"livemode\": false,
              \"lookup_key\": null,
              \"metadata\": {},
              \"nickname\": null,
              \"product\": \"prod_MTjYzrt****FSm\",
              \"recurring\": {
                \"aggregate_usage\": null,
                \"interval\": \"month\",
                \"interval_count\": 1,
                \"trial_period_days\": null,
                \"usage_type\": \"licensed\"
              },
              \"tax_behavior\": \"unspecified\",
              \"tiers_mode\": null,
              \"transform_quantity\": null,
              \"type\": \"recurring\",
              \"unit_amount\": 3700,
              \"unit_amount_decimal\": \"3700\"
            },
            \"proration\": false,
            \"proration_details\": {
              \"credited_items\": null
            },
            \"quantity\": 1,
            \"subscription\": null,
            \"subscription_item\": \"si_MTkjw****365QO\",
            \"tax_amounts\": [],
            \"tax_rates\": [],
            \"type\": \"subscription\",
            \"unique_id\": \"il_0LvfRmCKEf7b****W02LkMli\",
            \"unique_line_item_id\": \"sli_09f50cCKE****bt2a5104f59\",
            \"unit_amount_excluding_tax\": \"3700\"
          }
        ],
        \"has_more\": false,
        \"total_count\": 1,
        \"url\": \"/v1/invoices/in_0LkpzOCKEf7bNbt****p5kQ/lines\"
      },
      \"livemode\": false,
      \"metadata\": {},
      \"next_payment_attempt\": null,
      \"number\": \"77EC823A-0002\",
      \"on_behalf_of\": null,
      \"paid\": true,
      \"paid_out_of_band\": false,
      \"payment\": \"ch_2Lkq37CKEf7bNb****0bkJVa\",
      \"payment_intent\": \"pi_2Lkq37CKEf7****21k1FnV1V\",
      \"payment_settings\": {
        \"default_mandate\": null,
        \"payment_method_options\": null,
        \"payment_method_types\": null
      },
      \"period_end\": 1666436458,
      \"period_start\": 1663844458,
      \"post_payment_credit_notes_amount\": 0,
      \"pre_payment_credit_notes_amount\": 0,
      \"quote\": null,
      \"receipt_number\": null,
      \"rendering_options\": null,
      \"starting_balance\": 0,
      \"statement_descriptor\": null,
      \"status\": \"paid\",
      \"status_transitions\": {
        \"finalized_at\": 1666440058,
        \"marked_uncollectible_at\": null,
        \"paid_at\": 1666440058,
        \"voided_at\": null
      },
      \"subscription\": \"sub_0LknEJCKEf7bN****blGV2Lb\",
      \"subtotal\": 3700,
      \"subtotal_excluding_tax\": 3700,
      \"tax\": null,
      \"tax_percent\": null,
      \"test_clock\": \"clock_0LknBQCKEf7b****4PjP6QSa\",
      \"total\": 3700,
      \"total_discount_amounts\": [],
      \"total_excluding_tax\": 3700,
      \"total_tax_amounts\": [],
      \"transfer_data\": null,
      \"webhooks_delivered_at\": 1666436458
    },
    {
      \"id\": \"in_0LknEJCKEf7b*****uRU4Rxf\",
      \"object\": \"invoice\",
      \"account_country\": \"NL\",
      \"account_name\": \"My Business Inc.\",
      \"account_tax_ids\": null,
      \"amount_due\": 3700,
      \"amount_paid\": 3700,
      \"amount_remaining\": 0,
      \"application\": null,
      \"application_fee\": null,
      \"attempt_count\": 1,
      \"attempted\": true,
      \"auto_advance\": false,
      \"automatic_tax\": {
        \"enabled\": false,
        \"status\": null
      },
      \"billing\": \"charge_automatically\",
      \"billing_reason\": \"subscription_update\",
      \"charge\": \"ch_2LknEJCKEf7b****1V5n5Yvt\",
      \"closed\": true,
      \"collection_method\": \"charge_automatically\",
      \"created\": 1663844458,
      \"currency\": \"usd\",
      \"custom_fields\": null,
      \"customer\": \"cus_MTkib****56Uz4\",
      \"customer_address\": {
        \"city\": \"\",
        \"country\": \"US\",
        \"line1\": \"\",
        \"line2\": \"\",
        \"postal_code\": \"\",
        \"state\": \"\"
      },
      \"customer_email\": \"test1@****.net\",
      \"customer_name\": \"Test1\",
      \"customer_phone\": null,
      \"customer_shipping\": null,
      \"customer_tax_exempt\": \"none\",
      \"customer_tax_ids\": [],
      \"date\": 1663844458,
      \"default_payment_method\": null,
      \"default_source\": null,
      \"default_tax_rates\": [],
      \"description\": null,
      \"discount\": null,
      \"discounts\": [],
      \"due_date\": null,
      \"ending_balance\": 0,
      \"finalized_at\": 1663844458,
      \"footer\": null,
      \"forgiven\": false,
      \"from_invoice\": null,
      \"hosted_invoice_url\": \"https://invoice.stripe.com/i/acct_1mMtCKEf7bN****IJNR2/test_YWNjdF8xbU10Q0tF****TmJ0MkJJSk5SMixfTVRramExZWhaRkdDdlZnQzZ2WHVCM1Rja2pCb2s3Myw1NDM5ODkwNw0200eHBEg0mo?s=ap\",
      \"invoice_pdf\": \"https://pay.stripe.com/invoice/acct_1mMtCKEf7bNb****JNR2/test_YWNjdF8xbU10Q0tF*****mJ0MkJJSk5SMixfTVRramExZWhaRkdDdlZnQzZ2WHVCM1Rja2pCb2s3Myw1NDM5ODkwNw0200eHBEg0mo/pdf?s=ap\",
      \"last_finalization_error\": null,
      \"latest_revision\": null,
      \"lines\": {
        \"object\": \"list\",
        \"data\": [
          {
            \"id\": \"sub_0LknEJCKEf7b****bblGV2Lb\",
            \"object\": \"line_item\",
            \"amount\": 3700,
            \"amount_excluding_tax\": 3700,
            \"currency\": \"usd\",
            \"description\": null,
            \"discount_amounts\": [],
            \"discountable\": true,
            \"discounts\": [],
            \"livemode\": false,
            \"metadata\": {},
            \"period\": {
              \"end\": 1666436458,
              \"start\": 1663844458
            },
            \"plan\": {
              \"id\": \"plan_MTjYr****iEqvG\",
              \"object\": \"plan\",
              \"active\": true,
              \"aggregate_usage\": null,
              \"amount\": 3700,
              \"amount_decimal\": \"3700\",
              \"billing_scheme\": \"per_unit\",
              \"created\": 1663840359,
              \"currency\": \"usd\",
              \"interval\": \"month\",
              \"interval_count\": 1,
              \"livemode\": false,
              \"metadata\": {},
              \"name\": \"PrimaJust Basic - Normal (normal)\",
              \"nickname\": null,
              \"product\": \"prod_MTjYz****eFSm\",
              \"statement_descriptor\": null,
              \"tiers\": null,
              \"tiers_mode\": null,
              \"transform_usage\": null,
              \"trial_period_days\": null,
              \"usage_type\": \"licensed\"
            },
            \"price\": {
              \"id\": \"plan_MTjYri****EqvG\",
              \"object\": \"price\",
              \"active\": true,
              \"billing_scheme\": \"per_unit\",
              \"created\": 1663840359,
              \"currency\": \"usd\",
              \"custom_unit_amount\": null,
              \"livemode\": false,
              \"lookup_key\": null,
              \"metadata\": {},
              \"nickname\": null,
              \"product\": \"prod_MTjYz****eFSm\",
              \"recurring\": {
                \"aggregate_usage\": null,
                \"interval\": \"month\",
                \"interval_count\": 1,
                \"trial_period_days\": null,
                \"usage_type\": \"licensed\"
              },
              \"tax_behavior\": \"unspecified\",
              \"tiers_mode\": null,
              \"transform_quantity\": null,
              \"type\": \"recurring\",
              \"unit_amount\": 3700,
              \"unit_amount_decimal\": \"3700\"
            },
            \"proration\": false,
            \"proration_details\": {
              \"credited_items\": null
            },
            \"quantity\": 1,
            \"subscription\": null,
            \"subscription_item\": \"si_MTk****XN365QO\",
            \"tax_amounts\": [],
            \"tax_rates\": [],
            \"type\": \"subscription\",
            \"unique_id\": \"il_0Lkn9KCKEf7****3shtd1N3\",
            \"unique_line_item_id\": \"sli_00e967CKEf7****85391f22\",
            \"unit_amount_excluding_tax\": \"3700\"
          }
        ],
        \"has_more\": false,
        \"total_count\": 1,
        \"url\": \"/v1/invoices/in_0LknEJCKEf7b****uRU4Rxf/lines\"
      },
      \"livemode\": false,
      \"metadata\": {},
      \"next_payment_attempt\": null,
      \"number\": \"77E****23A-0001\",
      \"on_behalf_of\": null,
      \"paid\": true,
      \"paid_out_of_band\": false,
      \"payment\": \"ch_2LknEJCKEf7bN****V5n5Yvt\",
      \"payment_intent\": \"pi_2LknEJCKEf7bN****1cYRKSxK\",
      \"payment_settings\": {
        \"default_mandate\": null,
        \"payment_method_options\": null,
        \"payment_method_types\": null
      },
      \"period_end\": 1663844458,
      \"period_start\": 1663844458,
      \"post_payment_credit_notes_amount\": 0,
      \"pre_payment_credit_notes_amount\": 0,
      \"quote\": null,
      \"receipt_number\": null,
      \"rendering_options\": null,
      \"starting_balance\": 0,
      \"statement_descriptor\": null,
      \"status\": \"paid\",
      \"status_transitions\": {
        \"finalized_at\": 1663844458,
        \"marked_uncollectible_at\": null,
        \"paid_at\": 1663844458,
        \"voided_at\": null
      },
      \"subscription\": \"sub_0LknEJCKEf****t2bblGV2Lb\",
      \"subtotal\": 3700,
      \"subtotal_excluding_tax\": 3700,
      \"tax\": null,
      \"tax_percent\": null,
      \"test_clock\": \"clock_0LknBQCKEf****t24PjP6QSa\",
      \"total\": 3700,
      \"total_discount_amounts\": [],
      \"total_excluding_tax\": 3700,
      \"total_tax_amounts\": [],
      \"transfer_data\": null,
      \"webhooks_delivered_at\": 1663844458
    }
  ],
  \"has_more\": false,
  \"url\": \"/v1/invoices\"
}

我试过这个: $count = substr_count($result, $invoice);

其中 $result 是整个 json 并且 $invoice = \'\"object\": \"invoice\"\'。

这确实有效。它返回 2,这是正确的。但是,也许有更好的解决方案?更可靠的解决方案?

  • 您不应该在 JSON 文档中找到子字符串。您应该解析文档并与生成的数据结构进行交互。
  • Stripe 通常返回一个 JSON 数据对象,因此您应该使用 JSON_decode() 转换为一个对象,并使用标准的 PHP 数组内容计数功能(例如 array_column())简单地计算出现次数,其中已经有很多关于 StackOverflow 的信息。

标签: php json


【解决方案1】:

干得好

$arr = json_encode($jsonResponse /*from stripe*/, true);
$invoiceCount = count($arr["data"]);

【讨论】:

  • json_encode编码.你想解码。
【解决方案2】:

您可以使用正则表达式,例如

preg_match_all($string, 'object": "invoice', $matches);
$count = count($matches);

【讨论】:

  • 通过正则表达式使用 JSON 文档是一个非常糟糕的主意。它脆弱、缓慢且容易出错。像 JSON 这样的数据交换格式的全部意义在于它可以使用已知规则进行解析,保证正确的结果并且没有猜测工作。
  • @user229044 但是没有猜测的乐趣在哪里?! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多