2017-04-10 7 views
-1

는 I가 multidimensionnal PHP 배열의 값을 업데이트하고자하는 (PHP)을 array_walk 사용 : $ 들어 $ A다른 값 관련 multidimensionnal 배열의 값을 업데이트하고

array(1) { 
["test"]=> array(4) { 
[0]=> int(5) 
[1]=> int(7) 
[2]=> int(10) 
[3]=> int(14) 
} 
} 

을 A [ "테스트"] $ i], 나는이 새로운 값 $ a [ "test"] [$ i] - $ a [ "test"] [$ i-1]을 얻고 싶습니다. 물론

array(1) { 
["test"]=> array(4) { 
[0]=> int(5) 
[1]=> int(2) 
[2]=> int(3) 
[3]=> int(4) 
} 
} 

, 나는 foreach는 루프와 새로운 배열

$new = array(); 
foreach($a as $k=>$v){ 
for($i=0;$i<=3;$i++){ 
$new[$k][$i] = $v[$i] - $v[$i-1]; 
} 
} 
$a = $new; 
var_dump($a); 

와 함께 할 수 있지만이 최선의 방법입니다 :

이 경우 결과 배열은 것입니까? 호기심에서, array_walk를 사용하여 더 좋고, 대체로/어떻게 array_walk가 배열의 이전/다음 값에 액세스 할 수 있는지 궁금합니다.

정말 고마워요!

+1

'array_walk'을 사용할 때'function ($ a) use (& $ carray) {}'와 같은 클로저를 사용하여 prev./needed 데이터를 캐럴 할 수 있습니다. – JustOnUnderMillions

+1

정말로 '$ i = 1'을 원합니다. – AbraCadaver

+0

대단히 감사합니다! – user1719210

답변

0

PHP code demo

<?php 

$array = array(
    "test" => array(5, 7, 10, 14) 
); 
$new=array(); 
array_walk($array["test"], function($value,$key) use (&$new,&$array){ 
    if($key>0) 
    { 
     $new["test"][]=$array["test"][$key]-$array["test"][$key-1]; 
    } 
    else 
    { 
     $new["test"][]=$value; 
    } 
}); 
print_r($new); 

또는 :

어쨌든 결국 새로운 값으로 원래의 배열을 덮어하고 있기 때문에

PHP code demo

<?php 
$array = array(
    "test" => array(5, 7, 10, 14) 
); 
$newArray=array(); 
foreach($array["test"] as $key => $value) 
{ 
    if($key>0) 
    { 
     $newArray["test"][]=$array["test"][$key]-$array["test"][$key-1]; 
    } 
    else 
    { 
     $newArray["test"][]=$value; 
    } 
} 
print_r($newArray); 
0

, 당신은 수도뿐만 아니라 단지 이동하면서 원래 배열의 값을 변경하십시오.

사용자 지정 함수는 각 하위 집합에 대해 연속적인 빼기를 수행 할 수 있습니다.

function successive_subtraction(&$array) { 
    $subtrahend = 0;    // store the previous value for subtraction 
    foreach ($array as &$value) { 
     $temp = $value;   // store the current value in a temporary variable 
     $value -= $subtrahend;  // subtract the previous value 
     $subtrahend = $temp;  // original current value become new previous value 
    } 
} 

나서 array_walk와 외측 배열의 각 요소에 해당 기능을 적용한다.

array_walk($a, 'successive_subtraction'); 

이 코드는 실제로 이미 수행하는 방식보다 더 복잡합니다. 수정 된 복사본을 만든 다음 덮어 쓰지 않고 기존 배열을 수정하는 것이 가장 큰 장점은 메모리 사용량이 적을 것입니다. 그러나 다루는 배열이 너무 크지 않은 경우에는 그다지 문제가되지 않습니다. 나는 그것을 간단하게 유지한다고 말할 것이다.

+0

대단히 감사합니다! 정말 흥미 롭습니다. – user1719210