У меня есть массив PHP, который содержит числа в следующем формате:
$data = array(2,4,3,12,11,1,5);
Есть ли простой способ получить второй массив, показывающий различия этих элементов как T-1 (установка 0 для первого)?
Новый массив будет выглядеть так:
$data = array(0,2,-1,9,-1,-10,4)
Для этого итеративного процесса вычитания уменьшаемое это каждое значение в массиве.
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]
Других решений пока нет …