<?php
/**
* Filters JSON data with retry logic for data migration.
*
* @param string $jsonString The JSON string to parse and filter.
* @param array $filters An array of filter criteria (e.g., ['field' => 'name', 'operator' => '=', 'value' => 'John']).
* @param int $maxRetries The maximum number of retry attempts.
* @param int $retryDelay The delay in seconds between retries.
*
* @return array|null An array of filtered JSON objects, or null on failure after all retries.
*/
function filterJsonDataWithRetry(string $jsonString, array $filters, int $maxRetries = 3, int $retryDelay = 5): ?array
{
$filteredData = [];
$retries = 0;
while ($retries < $maxRetries) {
$retries++;
$data = json_decode($jsonString, true);
if ($data === null) {
// JSON decode failed.
error_log("JSON decode failed. Attempt: " . $retries);
if ($retries === $maxRetries) {
return null; // Return null if all retries fail.
}
sleep($retryDelay);
continue; // Retry
}
foreach ($data as $item) {
$match = true;
foreach ($filters as $filter) {
$field = $filter['field'];
$operator = $filter['operator'];
$value = $filter['value'];
if (!isset($item[$field])) {
$match = false;
break;
}
switch ($operator) {
case '=':
if ($item[$field] !== $value) {
$match = false;
break;
}
break;
case '!=':
if ($item[$field] === $value) {
$match = false;
break;
}
break;
case '>':
if ($item[$field] <= $value) {
$match = false;
break;
}
break;
case '<':
if ($item[$field] >= $value) {
$match = false;
break;
}
break;
case 'in':
if (!in_array($item[$field], [$value])) {
$match = false;
break;
}
break;
default:
error_log("Unsupported operator: " . $operator . ". Attempt: " . $retries);
$match = false;
break;
}
}
if ($match) {
$filteredData[] = $item;
}
}
break; // Exit the retry loop if successful.
}
return $filteredData;
}
?>
Add your comment