1. <?php
  2. /**
  3. * Filters JSON data with retry logic for data migration.
  4. *
  5. * @param string $jsonString The JSON string to parse and filter.
  6. * @param array $filters An array of filter criteria (e.g., ['field' => 'name', 'operator' => '=', 'value' => 'John']).
  7. * @param int $maxRetries The maximum number of retry attempts.
  8. * @param int $retryDelay The delay in seconds between retries.
  9. *
  10. * @return array|null An array of filtered JSON objects, or null on failure after all retries.
  11. */
  12. function filterJsonDataWithRetry(string $jsonString, array $filters, int $maxRetries = 3, int $retryDelay = 5): ?array
  13. {
  14. $filteredData = [];
  15. $retries = 0;
  16. while ($retries < $maxRetries) {
  17. $retries++;
  18. $data = json_decode($jsonString, true);
  19. if ($data === null) {
  20. // JSON decode failed.
  21. error_log("JSON decode failed. Attempt: " . $retries);
  22. if ($retries === $maxRetries) {
  23. return null; // Return null if all retries fail.
  24. }
  25. sleep($retryDelay);
  26. continue; // Retry
  27. }
  28. foreach ($data as $item) {
  29. $match = true;
  30. foreach ($filters as $filter) {
  31. $field = $filter['field'];
  32. $operator = $filter['operator'];
  33. $value = $filter['value'];
  34. if (!isset($item[$field])) {
  35. $match = false;
  36. break;
  37. }
  38. switch ($operator) {
  39. case '=':
  40. if ($item[$field] !== $value) {
  41. $match = false;
  42. break;
  43. }
  44. break;
  45. case '!=':
  46. if ($item[$field] === $value) {
  47. $match = false;
  48. break;
  49. }
  50. break;
  51. case '>':
  52. if ($item[$field] <= $value) {
  53. $match = false;
  54. break;
  55. }
  56. break;
  57. case '<':
  58. if ($item[$field] >= $value) {
  59. $match = false;
  60. break;
  61. }
  62. break;
  63. case 'in':
  64. if (!in_array($item[$field], [$value])) {
  65. $match = false;
  66. break;
  67. }
  68. break;
  69. default:
  70. error_log("Unsupported operator: " . $operator . ". Attempt: " . $retries);
  71. $match = false;
  72. break;
  73. }
  74. }
  75. if ($match) {
  76. $filteredData[] = $item;
  77. }
  78. }
  79. break; // Exit the retry loop if successful.
  80. }
  81. return $filteredData;
  82. }
  83. ?>

Add your comment