Вернуть один элемент из ассоциативного массива из функции - PullRequest
1 голос
/ 13 августа 2010

Предположим, у нас есть два PHP-массива:

 $some_array = array('a','b','c','d','e','f');
 $another_array = array(101,102,103,104,105,106);

В PHP уже есть некоторые функции-массивы, которые позволяют создавать ассоциативный массив (хэш AKA),e, g,;

 $hash = array_combine(
           $some_array,
           $another_array
         );

И вот оно.Что мне делать, если я хочу создать хеш в более функциональном стиле, если я хочу вычислить ключ и значение на лету и построить хэш с помощью операции map, например ( notworking ):

 # wishful thinking
 $hash = array_map(
            function($a, $b){ return ($a => $b); },
            $some_array,
            $another_array
         );

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

            ...
            function($a, $b){ return ($a => $b); }
            ...

действительно вернет значение ключа / пару хеша - чего нет.

В: Как я могу вернуть пару ключ / значение из функции - которую можно использовать для создания ассоциативного массива?

Приложение

Чтобы прояснить, что я действительно искал, приведу пример perl для генерации хеша:

 ...
 # we have one array of characters (on which our hash generation is based)

 my @array = qw{ a b c d e f };

 # now *generate* a hash with array contents as keys and 
 # ascii numbers as values in a *single operation *
 # (in Perl, the $_ variable represents the actual array element)

 my %hash = map +($_ => ord $_), @array;
 ...

Результат (% хеш):

 a => 97
 b => 98
 c => 99
 d => 100   
 e => 101
 f => 102

Исходя из ответов, я бы сейчас подумал, что это невозможно в PHP.Спасибо всем ответившим.

Ответы [ 3 ]

2 голосов
/ 14 августа 2010

РЕДАКТИРОВАТЬ: Не совсем ясно, есть ли у вас проблемы просто с возвратом нескольких переменных из функции, или у вас есть проблемы с сохранением функции в массиве.В вашем посте создается впечатление, что сохранение функции в массиве работает, поэтому я займусь проблемой return-множественных переменных.

В PHP нет способа вернуть один экземпляр пары ключ / значение.,Вы должны иметь их в массиве ... но помните, что в PHP массив и hashmap - это одно и то же.Это странно (и противоречиво), но это означает, что вполне законно возвращать массив / хэш-карту с несколькими значениями, которые вы хотите вернуть.

Есть только два разумных способа, которые я знаю (из 10+ лет PHP)опыт), чтобы получить более одной переменной из функции.Один из них - это хороший способ сделать входную переменную изменяемой.

function vacuumPackSandwitch(&$a, &$b) {
    $a = 505;
    $b = 707;
}

Это изменит и $ a, и $ b в отличие от изменения их копий, как обычно.Например:

$a = 1;
$b = 2;
vacuumPackSandwitch($a, $b);
print $a.' '.$b;

Это вернет "505 707", а не "1 2", как обычно.Возможно, вам придется сделать:

vacuumPackSandwitch(&$a, &$b);

Но если это так, компилятор PHP должным образом сообщит вам.

Другой способ - вернуть массив, который, я полагаю,более ясный и предпочтительный способ.

function ($a, $b) {
    return array($a, $b);
}

Вы можете получить обе переменные одновременно, выполнив:

list($c, $d) = vacuumPackSandwitch($a, $b);

Надеюсь, это поможет!

2 голосов
/ 14 августа 2010

В PHP массивы тоже могут быть ассоциативными!Массив с индексами int - это просто ассоциативный массив с 0 => element0 и т. Д.Таким образом, вы можете выполнить то, что ищете, вот так:

$somearray = array('name' => 'test', 'pass' => '***', 'group' => 'admin');

function myfunc($a, $b) { return array($a => $b); }

if($somearray['name'] == 'test') { echo 'it works!'; }

// Let's add more data with the function now
$somearray += myfunc('location', 'internet');

//Test the result
if($somearray['location'] == 'internet') { echo 'it works again!'; }

Это действительно очень просто.Надеюсь, это поможет.

1 голос
/ 01 сентября 2016

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

Идея 1:

Вместо того, чтобы возвращать пару ключ => значение, мы возвращаем массив только с одним элементом «ключ => значение» для каждого последовательного элемента исходных массивов. Затем мы уменьшаем эти массивы, сливаясь на каждом шагу.

$array = array_map(
    function($a, $b){
        return array($a => $b);
    },
    $arr1,
    $arr2
);
$array = array_reduce(
    $array,
    function($carry, $element){
        $carry = array_merge($carry, $element);
        return $carry;
    },
    array()
);

OR

Идея 2:

Аналогично первой идее, но мы выполняем присвоение ключа => значения в array_reduce. Мы передаем NULL в array_map, который создает массив массивов (http://php.net/manual/en/function.array-map.php)

$array = array_map(NULL, $a, $b);
$array = array_reduce(
    $array,
    function($carry, $element){
        $carry[$element[0]] = $element[1];
        return $carry;
    },
    array()
);

Лично я нахожу, что Идея 2 намного более элегантна, чем Идея 1, хотя для этого необходимо знать, что передача NULL в качестве функции array_map создает массив массивов и, следовательно, несколько не интуитивен. Я просто думаю об этом как о предвестнике array_reduce, где происходит все дело.

Идея 3:

$carry = array();
$uselessArray = array_map(
    function($a, $b) use ($carry){
        $carry[$a] = $b;
    },
    $a,
    $b
);

Идея 3 является альтернативой Идеи 2, но я думаю, что она более хакерская, чем Идея 2. Мы должны использовать «использование», чтобы выпрыгнуть из области действия функции, что довольно уродливо и, вероятно, противоречит функциональному стилю, который искал ОП .

Давайте немного упростим Idea 2 и посмотрим, как это выглядит:

Идея 2 (б):

$array = array_reduce(
    array_map(NULL, $a, $b),
    function($carry, $element){
        $carry[$element[0]] = $element[1];
        return $carry;
    },
    array()
);

Да, это мило.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...