Различия PHP в массиве элементов массива

У меня есть массив PHP, который содержит числа в следующем формате:

$data = array(2,4,3,12,11,1,5);

Есть ли простой способ получить второй массив, показывающий различия этих элементов как T-1 (установка 0 для первого)?

Новый массив будет выглядеть так:

$data = array(0,2,-1,9,-1,-10,4)

0

Решение

Для этого итеративного процесса вычитания уменьшаемое это каждое значение в массиве.
suptrahend является предыдущим значением (или, если нет предыдущего значения, первое значение в массиве). Поскольку значение первого элемента и его suptrahend всегда равны, первое значение в результате всегда равно нулю.

Все методы ниже будут использовать входной массив: $data = array(2,4,3,12,11,1,5);

При доступе к первому элементу для объявления начального suptrahend я использовал current($data) даже если $data[0] будет работать, избегает вызова функции и требует меньше символов. Это должно сделать мой метод более устойчивым и подходящим для обработки массивов, которые не начинаются с индекса 0,

Здесь array_walk () версия:

array_walk($data,function(&$v,$k)use($data){$v-=($k==0?$v:$data[$k-1]);});
var_export($data);
// $result=[0,2,-1,9,-1,-10,4]

array_walk() Метод можно считать лучшим вариантом, потому что он не создает $result массив, и при этом не нужно объявлять $last переменная для сохранения значения ранее повторенного элемента. Просто знайте, что вы не можете сжать array_walk() линия внутри var_export() — это вернется true,

Это для каждого() версия:

foreach($data as $k=>$v){
$result[]=$v-($k==0?$v:$data[$k-1]);
}
var_export($result);
// $result=[0,2,-1,9,-1,-10,4]

array_reduce() позволяет объявить начальный suptrahend через 3-й параметр функции. Здесь array_reduce () версия:

array_reduce($data,function($v1,$v2)use(&$result,&$last){$result[]=$v2-(is_null($v1)?$last:$v1); $last=$v2;},current($data));
var_export($result);
// $result=[0,2,-1,9,-1,-10,4]

Здесь array_map () версия:

$last=current($data);
array_map(function($v)use(&$result,&$last){$result[]=$v-$last; $last=$v;},$data);
var_export($result);
// $result=[0,2,-1,9,-1,-10,4]

// OR
// array_map(function($v,$k)use(&$result,$data){$result[]=$v-($k==0?$v:$data[$k-1]);},$data,array_keys($data));
// var_export($result);
// $result=[0,2,-1,9,-1,-10,4]

Здесь array_filter () версия:

$last=current($data);
array_filter($data,function($v)use(&$last,&$result){$result[]=$v-$last; $last=$v;});
// $result=[0,2,-1,9,-1,-10,4]

// OR
// array_filter($data,function($v,$k)use(&$result,$data){$result[]=$v-($k==0?$v:$data[$k-1]);},ARRAY_FILTER_USE_BOTH);
// var_export($result);
// $result=[0,2,-1,9,-1,-10,4]
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector