Сопоставление массивов в PHP с ключами


Просто из любопытства (я знаю, что это может быть однострочный оператор foreach), есть ли какая-нибудь функция массива PHP (или комбинация многих), которая дает массив, подобный:

Array (
    [0] => stdClass Object (
        [id] => 12
        [name] => Lorem
        [email] => [email protected]
    )
    [1] => stdClass Object (
        [id] => 34
        [name] => Ipsum
        [email] => [email protected]
    )
)

И, учитывая 'id' и 'name', получается что-то вроде:

Array (
    [12] => Lorem
    [34] => Ipsum
)

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

Author: lorenzo-s, 2012-08-21

4 answers

Просто используйте array_reduce:

$obj1 = new stdClass;
$obj1 -> id = 12;
$obj1 -> name = 'Lorem';
$obj1 -> email = '[email protected]';

$obj2 = new stdClass;
$obj2 -> id = 34;
$obj2 -> name = 'Ipsum';
$obj2 -> email = '[email protected]';

$reduced = array_reduce(
    // input array
    array($obj1, $obj2),
    // fold function
    function(&$result, $item){ 
        // at each step, push name into $item->id position
        $result[$item->id] = $item->name;
        return $result;
    },
    // initial fold container [optional]
    array()
);

Это однострочный комментарий ^^

 20
Author: moonwave99, 2012-09-08 13:52:50

Я обнаружил, что могу сделать:

array_combine(array_map(function($o) { return $o->id; }, $objs), array_map(function($o) { return $o->name; }, $objs));

Но это некрасиво и требует целых двух циклов в одном массиве.

 2
Author: lorenzo-s, 2012-08-21 09:07:32

Поскольку ваш массив является массивом объектов, вы можете вызвать (это похоже на переменную класса), попробуйте вызвать с помощью этого:

 foreach ($arrays as $object) {
    Echo $object->id;
    Echo "<br>";
    Echo $object->name;
    Echo "<br>";
    Echo $object->email;
    Echo "<br>";
 } 

Тогда вы можете сделать

 // your array of object example $arrays;
 $result = array();
 foreach ($arrays as $array) {
       $result[$array->id] = $array->name;
 }

   echo "<pre>";
   print_r($result);
   echo "</pre>";

Извините, что я отвечаю по телефону. Не удается отредактировать код

 0
Author: Josua Marcel Chrisano, 2012-09-08 13:37:21

Самый простой способ - использовать порт LINQ, такой как библиотека YaLinqo*. Он позволяет выполнять SQL-подобные запросы к массивам и объектам. Его toDictionary функция принимает два обратных вызова: один возвращающий ключ массива результатов и одно возвращаемое значение. Например:

$userNamesByIds = from($users)->toDictionary(
    function ($u) { return $u->id; },
    function ($u) { return $u->name; }
);

Или вы можете использовать более короткий синтаксис с использованием строк, что эквивалентно приведенной выше версии:

$userNamesByIds = from($users)->toDictionary('$v->id', '$v->name');

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

* разработанный мной

 0
Author: Athari, 2015-06-04 13:52:13