Функция C # Spec (15.2) утверждает: «Область локальной переменной или константы, объявленной в блоке, является блоком».
(в первом примере блок try это блок, в котором объявлено «s»)
С уважением, tamberg
<?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;
Вы уже знаете, как получить индекс в 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, но это еще один возможный способ сделать это.
То, что вы знаете о получении индекса в 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);
Дело в том, что функция предназначена для этого. Или вы пытаетесь использовать неправильную функцию. Некоторые другие функции могут быть тем, что вы ищете.
Или вы можете написать функцию, которая тоже это делает:)
Массивы в 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);
}
}