2016-05-18 2 views
4

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

<?php 
    $data= [ 
     0 => [1, 'test1'], 
     1 => [2, 'test2'], 
     2 => [3, 'test3'], 
    ]; 

    $ids = array_filter($data, function($item) { 
     return $item[0]; 
    }); 

    var_dump($ids); 

Но когда я var_dump $ids я получаю выход:

array (size=3) 
    0 => 
    array (size=2) 
     0 => int 1 
     1 => string 'test1' (length=5) 
    1 => 
    array (size=2) 
     0 => int 2 
     1 => string 'test2' (length=5) 
    2 => 
    array (size=2) 
     0 => int 3 
     1 => string 'test3' (length=5) 

Почему не выход:

array (size=3) 
    0 => int 1 
    1 => int 2 
    2 => int 3 
+1

array_filter() обратного вызова возвращает истина/ложь, указывающий, следует ли включить или исключить из отфильтрованного массива элемент; вы всегда возвращаете правдивое значение –

+2

Если вы хотите получить только идентификаторы (столбец '0'), вы должны использовать [array_column()] (http://www.php.net/manual/en/function .array-column.php): '$ ids == array_column ($ data, 0);' –

+0

'array_column' работает как шарм! И я считаю, что это именно то, что мне нужно в этом случае. – Ben

ответ

7

array_filter используется для фильтрации элементов массива на основе о том, удовлетворяют ли они определенному критерию. Таким образом, вы создаете функцию, которая возвращает true или false, и тестируйте каждый элемент массива против него. Ваша функция всегда будет возвращать true, поскольку каждый массив имеет в ней первый элемент, поэтому массив не изменяется.

Что вы ищете, это array_map, который изменяет каждый элемент в массиве, запустив обратный вызов над ним.

<?php 
$data= [ 
    0 => [1, 'test1'], 
    1 => [2, 'test2'], 
    2 => [3, 'test3'], 
]; 

$ids = array_map(function($item) { 
    return $item[0]; 
}, $data); 

var_dump($ids); 
+0

Спасибо за разъяснение разницы. Почему-то «фильтр» звучит более логично для меня. + 1A – Ben

0

функция включена в array_filter должна возвращать истинным или ложным , 0 или пустой массив преобразуются в FALSE. Ненулевые числа считаются истинными.

так что если вы хотите, чтобы найти элемент с идентификатором 2, вы должны сравнить его с 2, как этот

<?php 
$data= [ 
    0 => [1, 'test1'], 
    1 => [2, 'test2'], 
    2 => [3, 'test3'], 
]; 

$ids = array_filter($data, function($item) { 
    return $item[0] == 2; 
}); 

var_dump($ids); 

выход

 
array(1) { 
    [1] => 
    array(2) { 
    [0] => 
    int(2) 
    [1] => 
    string(5) "test2" 
    } 
} 
1

Try ниже кода

$data= [ 
     0 => [1, 'test1'], 
     1 => [2, 'test2'], 
     2 => [3, 'test3'], 
    ]; 

    $ids = array_map(function($item) { 
     return $item[0]; 
    }, $data); 

    var_dump($ids); 
+0

Проверяйте другие ответы перед публикацией! Это уже отправлено @iainn – Thamilan

1

Функция фильтра должна возвращать логическое значение (или любое значение, которое может быть принуждено к истине) для каждого элемента, так что он может быть спасен. Таким образом, в вашем случае он всегда возвращает true для каждого элемента массива

Чтобы получить результат, вам придется иметь массив array_walk;

$data = [ 
     0 => [1, 'test1'], 
     1 => [2, 'test2'], 
     2 => [3, 'test3'], 
    ]; 


array_walk($data, function($value, $key) use ($data){ 
        $data[$key] = $value[0]; 
      }) 
+0

Это выглядит сложнее, чем предлагаемый 'array_column' или' array_map'. Благодарим за вклад в возможности 'array_walk'. +1 – Ben

1

Попробуйте этот код

$data= [ 
     0 => [1, 'test1'], 
     1 => [2, 'test2'], 
     2 => [3, 'test3'], 
    ]; 

    $ids = array_column($data, 0); 
    var_dump($ids); 
Смежные вопросы