2016-06-27 5 views
1

Есть ли функция PHP или другое решение, которое облегчит разбиение массива на основе значения из его подмассивов?Сплит PHP-массив на основе значений подмассива

Да, я знаю, что могу сделать это с помощью петли! Вопрос в том, есть ли другой способ сделать это, не пропустив цикл.

Пример:

Используя значение Активный, превратить этот массив ...

$array_all => Array 
(
    [126] => Array 
     (
      [DisplayName] => Customer ABC 
      [Active] => 1 
     ) 

    [1596] => Array 
     (
      [DisplayName] => Customer 123 
      [Active] => 0 
     ) 

    [1648] => Array 
     (
      [DisplayName] => John Q Sample 
      [Active] => 1 
     ) 

    [1649] => Array 
     (
      [DisplayName] => Fry & Leela, Inc. 
      [Active] => 0 
     ) 

    [1571] => Array 
     (
      [DisplayName] => Class Action: Redshirts vs. UFP 
      [Active] => 1 
     ) 
) 

... в этом массиве ...

$array_active => Array 
(
    [126] => Array 
     (
      [DisplayName] => Customer ABC 
      [Active] => 1 
     ) 

    [1648] => Array 
     (
      [DisplayName] => John Q Sample 
      [Active] => 1 
     ) 

    [1571] => Array 
     (
      [DisplayName] => Class Action: Redshirts vs. UFP 
      [Active] => 1 
     ) 
) 

... и этот массив.

$array_inactive => Array 
(

    [1596] => Array 
     (
      [DisplayName] => Customer 123 
      [Active] => 0 
     ) 

    [1649] => Array 
     (
      [DisplayName] => Fry & Leela, Inc. 
      [Active] => 0 
     ) 

) 
+0

'array_filter' или' array_reduce'? – Fabricator

+1

Будут петли, несмотря ни на что. почему каждый спрашивает «с отсутствующими циклами». –

+0

@Dagon. Потому что иногда приятно не перебирать ваши данные. Следовательно, языковые функции. Например, вы можете прокручивать строку и заглавные буквы каждого символа, но это обычная задача, поэтому PHP любезно предоставляет strtoupper(). Да, есть циклы, но мне не приходится иметь дело с этим каждый раз, когда я хочу строку с верхним регистром. Тоже для array_filter - это общая задача в моем текущем проекте, и я хотел знать, был ли PHP встроен, прежде чем я сам ее создал. Хотя я немного смущен, чтобы не подумать о array_filter(), который буквально является именем того, что я хотел сделать ... – Eli

ответ

7

Вы можете использовать array_filter:

$actives = array_filter($array_all, function ($row) { 
    return $row["Active"]; 
}); 

$notActives = array_filter($array_all, function ($row) { 
    return !$row["Active"]; 
}); 

Вы можете также использовать array_reduce в качестве альтернативы, но она возвращает индексированный массив, так что без исходных ключей:

list($actives, $notActives) = array_reduce($array_all, function ($result, $row) { 
    $result[$row["Active"]][] = $row; 
    return $result; 
}, [[],[]]); 

При использовании array_reduce в также сохраняют ключи, он становится довольно подробным:

list($actives, $notActives) = array_reduce(array_keys($array_all), 
    function ($result, $key) use ($array_all) { 
     $result[$array_all[$key]["Active"]][$key] = $array_all[$key]; 
     return $result; 
    }, [[],[]] 
); 
+0

А, да. array_filter(). Буквально название того, что я хотел сделать. Должно быть, устал вчера = o) Спасибо! – Eli

Смежные вопросы