PHP массив. Простой сплит на основе ключа - PullRequest
6 голосов
/ 02 ноября 2011

Это скорее просьба о быстром совете, поскольку мне очень трудно поверить, что для этой задачи нет встроенной функции.Рассмотрим следующее:

array => 
(0) => array("id" => "1", "groupname" => "fudge", "etc" => "lorem ipsum"),
(1) => array("id" => "2", "groupname" => "toffee", "etc" => "lorem ipsum"),
(2) => array("id" => "3", "groupname" => "caramel", "etc" => "lorem ipsum")
)

Я хочу получить новый массив, который использует только «имя группы», поэтому он будет равен:

array =>
(0) => "fudge",
(1) => "toffee",
(2) => "caramel"
)

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

Спасибо за чтение этого вопроса Саймон

Ответы [ 6 ]

6 голосов
/ 13 февраля 2015

Для этого есть собственная функция array_column () (начиная с PHP 5.5):

$column = array_column($arr, 'groupname');
6 голосов
/ 02 ноября 2011

Если вы используете PHP 5.3, вы можете использовать array_map [документы] как это:

$newArray = array_map(function($value) {
    return $value['groupname'];
}, $array);

В противном случае создайте обычную функцию и передайте ее имя (см. Документацию).

Другое решение состоит в том, чтобы просто перебрать массив:

$newArray = array();

foreach($array as $value) {
    $newArray[] = $value['groupname'];
}

Вы определенно не должны использовать рекурсию.

1 голос
/ 11 марта 2016

Значения по всем ключам массива:

$array = [
    ["id"=>"1","user"=>"Ivan"],
    ["id"=>"2","user"=>"Ivan"],
    ["id"=>"3","user"=>"Elena"]
    ];

$res = [];
$array_separate = function($value, $key) use (&$res){
    foreach($value AS $k=>$v) {
        $res[$k][] = $v;
    }
};

array_walk($array, $array_separate);
print_r($res);

результат:

Array
(
    [id] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )
    [user] => Array
        (
            [0] => Ivan
            [1] => Ivan
            [2] => Elena
        )

)

http://sandbox.onlinephpfunctions.com/code/3a8f443283836468d8dc232ae8cc8d11827a5355

1 голос
/ 02 ноября 2011

Использование array_map:

<?php
$a = array(
    array("id" => "1", "groupname" => "fudge", "etc" => "lorem ipsum"),
    array("id" => "2", "groupname" => "toffee", "etc" => "lorem ipsum"),
    array("id" => "3", "groupname" => "caramel", "etc" => "lorem ipsum")
);

function get_groupname( $arr )
{
    return $arr['groupname'];
}
$b = array_map( 'get_groupname', $a );

var_dump( $a );
var_dump( $b );

http://codepad.org/7kNi8nNm

0 голосов
/ 02 ноября 2011
function array_get_keys(&$array, $key) {
    foreach($array as &$value) $value = $value[$key];
}
array_get_keys($array, 'groupname');

или

function array_get_keys(&$array, $key) {
    $result = Array();
    foreach($array as &$value) $result[] = $value[$key];
    return $result;
}
$new_array = array_get_keys($array, 'groupname');
0 голосов
/ 02 ноября 2011

Насколько я знаю, в PHP нет простой функции, которая могла бы справиться с этим для вас, структура массива определяется пользователем, вам придется циклически проходить по массиву.Самый простой способ, которым я могу придумать, будет примерно таким:

for($i = 0;$i < count($main_array);$i++){
    $groupname_array[] = $main_array[$i]["groupname"];
}
...