2016-01-06 2 views
2

У меня есть массив как это:Получить элементы массива по внутреннему значению

$a = [ 
    0 => ['a' => ['id' => 10, 'value' => 111]], 
    1 => ['a' => ['id' => 20, 'value' => 222]], 
    2 => ['a' => ['id' => 30, 'value' => 333]] 
]; 

Я хочу использовать этот массив внутри array_filter() для фильтрации $ids сравнив value:

$ids = [10, 20, 30]; 
$filtered = array_filter($ids, function($id) use($a) { 
    return $a[$id][$value] == 222; //this is wrong, just to show what I'm trying 
}); 

Как я могу это сделать ? Благодаря!

+0

Начните с 'var_dump ($ id)' внутри обратного вызова и посмотрите его структуру. –

ответ

2

Ваш подход неправильный. Что вы хотите фильтровать?

Все элементы от $ids которые находятся в $a с value 222?

Тогда это сделать:

$ids = array(); 
foreach ($a as $item) { 
    if ($item['a']['value'] == 222) 
     $ids[] = $item['a']['id']; 
} 

Update: array_filter возвращает полный элемент массива, то это означает, что он не возвращает только id:

$ids = array_filter($a, function($v) { return $v['a']['value'] == 222; }); 
+0

Да, это то, что я хочу сделать, но я бы хотел использовать 'array_filter' ... но я думаю, что нет никакого способа сделать это, используя' array_filter'. –

+0

Обновлено, но 'array_filter' будет выполнять часть работы. –

0

Проблема заключается в том, $a не 10, 20, 30 ключей, но 0, 1, 2. При использовании $a[$id] внутри затвора, он перебирает для $a[10], $a[20], $a[30] (которые не существуют).

Если вы хотите отфильтровать $a, тогда установите $a в качестве первого параметра array_filter. Вы используете $ids в качестве первого параметра, и он не итерации для $a.

0

На самом деле я не понимаю, почему U нужен массив $ ids. Ребята сказали правильно, вам нужно пройти $ массив, и код будет

$filtered = array_filter($a, function($item) { 
     return $item['a']['value'] == 222; 
    }); 
Смежные вопросы