0

定期的に更新される値の配列があります。配列が更新されたら、更新された配列の新しい値を使用してアクションを実行したいと思います。

$old_node->field_name[0]['value'] = 'red'
$old_node->field_name[1]['value'] = 'yellow'
$old_node->field_name[2]['value'] = 'blue'


$updated_node->field_name[0]['value'] = 'green',
$updated_node->field_name[1]['value'] = 'red',
$updated_node->field_name[2]['value'] ='purple',
$updated_node->field_name[3]['value'] = 'blue',

したがって、「緑」と「紫」の値は、新しい配列の新しい値です。関数を介して新しい配列に追加された各値を実行する必要があります。何かのようなもの:

foreach(of the newly added values that are in the new array){
 //do stuff;
}

一部の値は配列の更新時に削除される可能性があるため、key=>valueのペアが変更される可能性があります。

私はもう試した:

foreach($updated_node->field_name as $new_value){
    if(!in_array($new_value['value'], $old_node->field_name) && $new_value['value'] !== NULL){

    //Do stuff; 

        } 
    } 

しかし、それはうまくいきません。また、array_diffとarray_intersectを使用して新しい値を選択しようとしましたが、どちらも機能していません。

4

3 に答える 3

1

array_diff()を使用する

$old_array = array(
          0 => 'red',
          1 =>'yellow',
          2 => 'blue'
);

$new_array = array(
          0 => 'green',
          1 => 'red',
          2 =>'purple',
          4 => 'blue'
);

$diff = array_diff($new_array, $old_array);

print_r($diff);

/*
Array
(
    [0] => green
    [2] => purple
)
*/

あなたの新しいコードのために

$old_node->field_name[0]['value'] = 'red';
$old_node->field_name[1]['value'] = 'yellow';
$old_node->field_name[2]['value'] = 'blue';


$updated_node->field_name[0]['value'] = 'green';
$updated_node->field_name[1]['value'] = 'red';
$updated_node->field_name[2]['value'] = 'purple';
$updated_node->field_name[3]['value'] = 'blue';

$diff = array();
foreach($updated_node->field_name as $num => $field){
    $tmpval = false;
    foreach($old_node->field_name as $old){
        if($field['value'] == $old['value']){
            $tmpval = true;
        }
    }
    if(!$tmpval){
        $diff[$num] = $field['value'];    
    }
}

print_r($diff);

/*
Array
(
    [0] => green
    [2] => purple
)
*/
于 2012-08-27T05:34:16.573 に答える
0

以下は、追加された値と削除された値を含む 2 つの配列をロードする単純な関数です。

function loadArrayDifferences($before, $after, &$added, &$removed) {
    $added = array_diff($after, $before);
    $removed = array_diff($before, $after);
}

テストスクリプトは次のとおりです。

<?php

$ar1 = array(
'one',
'two',
'three',
'four'  

);
$ar2 = array(
'two',
'four',
'six',
'eight',    
);

$adds = array();
$rems = array();
loadArrayDifferences($ar1, $ar2, $adds, $rems);
var_dump($adds);
var_dump($rems);

function loadArrayDifferences($before, $after, &$added, &$removed) {
    $added = array_diff($after, $before);
    $removed = array_diff($before, $after);
}

出力:

array(2) {
  [2]=>
  string(3) "six"
  [3]=>
  string(5) "eight"
}
array(2) {
  [0]=>
  string(3) "one"
  [2]=>
  string(5) "three"
}
于 2012-08-27T05:37:23.417 に答える
0
$old_array = array(
          [0] => 'red',
          [1] =>'yellow',
          [2] => 'blue',
);

$new_array = array(
          [0] => 'green',
          [1] => 'red',
          [2] =>'purple',
          [4] => 'blue',
);

$diff = array_diff($new_array, $old_array);
var_dump($diff);

その結果、

array(2) {
  [0]=>
  string(5) "green"
  [2]=>
  string(6) "purple"
}

これは正しい (予想される) 結果です。

于 2012-08-27T05:34:54.370 に答える