PHP array_filter получить значение без ключа - PullRequest
0 голосов
/ 10 июля 2020

Я исхожу из фона Javascript, и я пытаюсь использовать array_filter(), но он работает совсем иначе, чем JS.

Взяв этот JS пример:

const people = [
  {
    name: 'Will',
    username: 'will',
  },
  {
    name: 'Alex',
    username: 'alex',
  },
  {
    name: 'Abraham',
    username: 'abraham',
  },
];

const usernameToFind = 'abraham';

const found = people.filter(person => person.username === usernameToFind);

console.log(found[0]); // index 0

// {
//   name: 'Abraham',
//   username: 'abraham'
// }

Я ожидаю, что все имена пользователей будут разными, поэтому он всегда будет возвращать только одно значение. Поэтому, если я хочу получить доступ к найденной информации, я просто прошу индекс 0.

On PHP:

<?php

$people = [
  [
    'name' => 'Alex',
    'username' => 'alex',
  ],
  [
    'name' => 'Will',
    'username' => 'will',
  ],
  [
    'name' => 'Abraham',
    'username' => 'abraham',
  ],
];

$usernameToFind = 'abraham';

$found = array_filter($people, function($person) use ($usernameToFind) {
  return $person['username'] === $usernameToFind;
});

print_r($found);

// Array
// (
//     [2] => Array
//         (
//             [name] => Abraham
//             [username] => abraham
//         )
// )

Итак, моя проблема: я получаю массив с индексом найденного элемента, но я не знаю, что это за индекс.

Я видел этот вопрос, но он совсем другой: PHP array_filter, чтобы получить только одно значение из массива .

Я не использую array_search(), потому что моя стрелка для поиска имеет глубину 2 или 3 уровня, например:

array_filter($people, function ($person) use ($cityToFind) {
   return $person['location']['city'] === $cityToFind;
}

Я могу использовать a для l oop, но я действительно вместо этого хотел использовать фильтр. Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 10 июля 2020

Вы можете сделать несколько вещей.

  1. Чтобы получить первый элемент массива, вы можете использовать reset($found) https://www.php.net/manual/en/function.reset.php

  2. После фильтрации массива вы можете сбросить ключи массива, чтобы они начинались с 0, используя array_values($found) https://www.php.net/manual/en/function.array-values.php

2 голосов
/ 10 июля 2020

Использование array_filter() всегда будет обрабатывать весь массив, в вашем примере это последняя запись, поэтому в любом случае это необходимо. Но если у вас было 500 записей, и это была первая 1, он все равно будет проверять все 500 записей.

Вместо этого вы можете использовать простой foreach() l oop, который останавливается, как только находит первую. ...

foreach ( $people as $index => $person )    {
    if ( $person['username'] === $usernameToFind )  {
        echo "Index={$index} name={$person['name']}";
        break;
    }
}

дает ...

Index=2 name=Abraham

В качестве ответа на ваш исходный вопрос - вы можете использовать После array_filter (), как я могу сбросить ключи на go в числовом порядке, начиная с 0 , чтобы сбросить клавиши, чтобы вы могли использовать [0].

...