@cm_platon

Как сделать сортировку и фильтрацию JSON массива по заданному паттерну?

Доброго времени суток!

Есть JSON:

[
    { "firstName": "John",  "lastName": "Doe", "birth": "1987-01-01" }, 
    { "firstName": "Anna", "lastName": "Smith", "birth": "1999-03-03" }, 
    { "firstName": "Peter", "lastName": "Doe", "birth": "1989-02-02" },
    { "firstName": "Al", "lastName": "Sums", "birth": "1980-04-04" }
]


Перевожу всё в PHP-массив (json_decode). Теперь сам вопрос. Как сделать вот такой вывод значений полученного массива:

  1. функция пробегает по массиву и сравнивает значение элемента "lastName" с заданным паттерном (например, "Doe")
  2. далее, если есть совпадения, то выбирает только один элемент (у которого наименьшее значение в "birth")
  3. выводит этот единственный элемент


То есть, из всего массива (выше) будет отображён только вот этот элемент:

[
    { "firstName": "John",  "lastName": "Doe", "birth": "1987-01-01" }
]
  • Вопрос задан
  • 847 просмотров
Решения вопроса 1
@titronfan
Сорри за не грамотный код. Вроде работает.
<?
$str = '[
    { "firstName": "John",  "lastName": "Doe", "birth": "1987-01-01" }, 
    { "firstName": "Anna", "lastName": "Doe", "birth": "1999-03-03" }, 
    { "firstName": "Peter", "lastName": "Doe", "birth": "1989-02-02" },
    { "firstName": "Al", "lastName": "Sums", "birth": "1980-04-04" }
]';

$arr = json_decode($str);

$arr_search = array();
$count = 0;
foreach ($arr as $key => $value) {
  if ($value->lastName == 'Doe') {
    $arr_search[$count] = $value->birth;
  }
  $count++;
}

asort($arr_search);
$first_key = key($arr_search);
var_dump($arr[$first_key]);
?>
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Парадокс! Куда катится мир)
Работать с выборкой/сортировкой данных нужно на уровне базы данных!
Внутри PHP - только манипуляция с ними и подготовка контента для вывода.
Ответ написан
Alyovkin
@Alyovkin
Full-stack developer
/**
 * Sort data (for fun)
 *
 * @param array|string $input
 * @param string $pattern
 * @return array
 */
function search($input, $pattern) {
    if (is_string($input))
        $input = json_decode($input);

    $clean = [];

    foreach($input as $item) {
        if($item->lastName == $pattern) {
            $clean[] = $item;
        }
    }

    if(count($clean) > 1)

        foreach($clean as $key => $value) {
            $cmpDate[$key] = date($value->birth);
        }

    $clean[] = array_multisort($cmpDate, SORT_ASC, $clean);

    return array_values($clean)[0];
    
}

var_dump(search($json, 'Doe'));


b63a1f4ee20843eba6347377174a4186.png
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы