Поиск всех значений в массиве по совпадению без цикла

83
22 сентября 2019, 22:50

Есть ассоциативный массив нужно выбрать конкретные значения по совпадению и хотелось бы сделать все это без цикла, так как массивы могут быть большие, подскажите как это можно реализовать? К примеру:

0 =>[
  'user'=> 'ivan'
  'amount' => 50
  'date' => '2019'
  ],
1=>  [
  'user'=> 'dima'
  'amount' => 10
  'date' => '2019'
  ],
2=>  [
  'user'=> 'ivan'
  'amount' => 11
  'date' => '2019'
  ],

мне нужно оставить к примеру ivan и чтобы на выходе получить такое:

0 =>[
      'user'=> 'ivan'
      'amount' => 50
      'date' => '2019'
      ],
1=>  [
      'user'=> 'ivan'
      'amount' => 11
      'date' => '2019'
      ],
Answer 1

Следует понимать, что если цикл не прописан явно в скрипте, то это совсем не означает, что цикла не будет вообще. Следует, также, понимать, что перебрать массив без цикла в принципе невозможно. То есть, цикл будет, независимо от пожеланий автора вопроса.

Также следует понимать, что в погоне за оптимизацией можно получить результат, прямо противоположный ожидаемому. Что мы и имеем в данном случае - в попытке избежать одного цикла автор вопроса в результате в одном из ответов получил два: один цикл чтобы перебрать исходный массив, и второй - чтобы перебрать результирующий.

Мораль: задача поиска в массиве без цикла не имеет смысла.

Answer 2

сделать все это без цикла

Можно отфильтровать массив с помощью array_filter(), и сбросить ключи с помощью array_values():

$arr = [
    [
        'user'=> 'ivan',
        'amount' => 50,
        'date' => '2019'
    ],
    [
        'user'=> 'dima',
        'amount' => 10,
        'date' => '2019'
    ],
    [
        'user'=> 'ivan',
        'amount' => 11,
        'date' => '2019'
    ]
];
$arr = array_values(array_filter($arr, function($a){
    return in_array('ivan', $a);
}));
print_r($arr);

Результат:

Array
(
    [0] => Array
        (
            [user] => ivan
            [amount] => 50
            [date] => 2019
        )
    [1] => Array
        (
            [user] => ivan
            [amount] => 11
            [date] => 2019
        )
)
Answer 3

спасибо , немного доработал , как мне кажется без доп функции in_arr будет быстрее

$search = 'ivan';
$res = array_filter($arr, function($v) use ($search){
     return $v['user'] == $search;
});
READ ALSO
Как собрать строку?

Как собрать строку?

Есть массив с данными, нужно перезаписать его, что бы получить массив с данными для каждого товараНо, еще нужно записать несколько одинаковых...

100
PHP авторизация по сертификату

PHP авторизация по сертификату

Возможно ли реализовать авторизацию на PHP используя имеющиеся сертификаты? Есть данные сертификатов ( серийные номера срок действия итд...

109