как получить доступ к текущему индексу в array_reduce?

Функция C # Spec (15.2) утверждает: «Область локальной переменной или константы, объявленной в блоке, является блоком».

(в первом примере блок try это блок, в котором объявлено «s»)

С уважением, tamberg

1
задан robskrob 18 January 2019 в 17:40
поделиться

4 ответа

<?php
$data = ['one', 'two', 'three'];

$result = array_reduce($data, function($carry, $item){
    $carry['out'] .= $carry['i'] . ') '. $item . '; ';
    $carry['i']++;
    return $carry;
}, ['out' => '', 'i' => 1] )['out'];

echo $result; // 1) one; 2) two; 3) three;
0
ответ дан Umanshield 18 January 2019 в 17:40
поделиться

Вы уже знаете, как получить индекс в array_map, так что вы можете использовать его для уменьшения, если хотите. Просто use ссылка на переменную «carry» в обратном вызове.

$example = ['a' => 1, 'b' => 2, 'c' => 3];

array_map(function($key, $value) use (&$reduced) {
    $reduced .= "$key$value";  // for example
}, array_keys($example), $example);

echo $reduced;  //a1b2c3

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

0
ответ дан Don't Panic 18 January 2019 в 17:40
поделиться

То, что вы знаете о получении индекса в array_reduce, не существует. Проверьте документацию.

Вопрос в том, , почему ?

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

В некоторых других языках они могут предоставлять текущий индекс, но не для этого array_reduce в PHP. Это язык и функция разработаны, есть некоторые ограничения в реализации.

Но это не значит, что у тебя не может быть этого. Вы можете получить его, но не через обратный вызов!

$i = 0;
$data = [1, 2, 3, 4];

// (1) 
$result = array_reduce($data, function ($c, $i) { return $c + $i; }, 0);

// (2)
array_reduce($data, function ($c, $i) { echo "$i\n"; $i++; return $c + $i; }, 0);

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

Или вы можете написать функцию, которая тоже это делает:)

0
ответ дан Pete Houston 18 January 2019 в 17:40
поделиться

Массивы в PHP - это своеобразные вещи: их можно использовать в качестве списков, очередей, словарей, множеств, упорядоченных словарей и всевозможных других многозначных структур. Однако большинство функций написаны с учетом одной или двух из этих структур.

В случае array_reduce, массив обрабатывается как список - упорядоченная коллекция элементов. Таким образом, ключи массива не передаются обратному вызову. Это имеет смысл для общих случаев, таких как вычисление итога или среднего и т. Д.

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

С другой стороны, есть две связанные функции, которые могут быть использованы вместо:

  • array_map, который выполняет обратный вызов для каждого элемента и создает новый массив с одним элементом вывода для элемент ввода
  • array_walk, который запускает обратный вызов для каждого элемента и игнорирует результат, но может принимать третий параметр по ссылке, где могут накапливаться побочные эффекты

Все три функции также могут быть тривиально реализованы с помощью цикла foreach, так что вы можете написать свою собственную функцию reduce примерно так ( untested ):

function array_reduce_assoc(array $array, callable $callback, $initial=null) {
    $carry = $initial;
    foreach ( $array as $key => $value ) {
        $carry = $callback($carry, $key, $value);
    }
}
0
ответ дан IMSoP 18 January 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: