基于另一个数组上相同键中的值更改多维数组键的值

时间:2015-07-11 00:38:18

标签: php arrays

我有2个阵列:

 $s_array: Array
(
    [0] => Array
        (
            [field_1] => S. Miguel
            [field_2] => Continente
            [valor] => 0
        )
[1] => Array
    (
        [field_1] => S. Miguel
        [field_2] => Guarita
        [valor] => 0
    )

[2] => Array
    (
        [field_1] => S. Miguel
        [field_2] => Manteiga
        [valor] => 0
    )

[3] => Array
    (
        [field_1] => S. Miguel
        [field_2] => Solmar
        [valor] => 0
    )

[4] => Array
    (
        [field_1] => Terceira
        [field_2] => Continente
        [valor] => 0
    )

[5] => Array
    (
        [field_1] => Terceira
        [field_2] => Guarita
        [valor] => 0
    )

[6] => Array
    (
        [field_1] => Terceira
        [field_2] => Manteiga
        [valor] => 0
    )

[7] => Array
    (
        [field_1] => Terceira
        [field_2] => Solmar
        [valor] => 0
    )

)

 $r_array: Array
(
    [0] => Array
        (
            [field_1] => S. Miguel
            [field_2] => Continente
            [valor] => 185
        )

[1] => Array
    (
        [field_1] => S. Miguel
        [field_2] => Manteiga
        [valor] => 208
    )

[2] => Array
    (
        [field_1] => S. Miguel
        [field_2] => Solmar
        [valor] => 187
    )

[3] => Array
    (
        [field_1] => Terceira
        [field_2] => Continente
        [valor] => 192
    )

[4] => Array
    (
        [field_1] => Terceira
        [field_2] => Guarita
        [valor] => 199
    )

我需要做的是更改key [valor]$s_array的值,并使用key [valor]$r_array的值,以防其他键[field_1]和[field_2]在两个数组上都有相同的值。

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

试试这个应该没问题,两个数组必须大小相同

<?php

for($i=0 ; $i<count($s_array) ; $i++){

    $s_element = $s_array[$i];
    $r_element = $r_array[$i];

    if(($s_element["field_1"]==$r_element["field_1"]) && ($s_element["field_2"]==$r_element["field_2"]) ){
        $s_array[$i]["valor"] = $r_array[$i]["valor"]
    }
}

?>

答案 1 :(得分:0)

for($i=0 ; $i<count($s_array) ; $i++) {

    $s_element = $s_array[$i];
    $r_value = 0;

    for($z=0 ; $z<count($r_array) ; $z++) {
        $r_element = $r_array[$z];
        if(($s_element["field_1"]==$r_element["field_1"]) && ($s_element["field_2"]==$r_element["field_2"]) ) {
            $r_value = $r_element["valor"];
        }
        if($r_value != 0) {
            $s_array[$i]["valor"] = $r_value;
        }
    }
}

答案 2 :(得分:0)

这是一个运行时成本为:

的程序

两次通过......

  • 按顺序传递每个源数组
  • 查找表
  • A&#39; key&#39;查找两个表以从$ t更新$ s。

即。运行时间与输入数组的大小以及创建“查找”的成本成正比。阵列。

小阵列并不便宜。

Working code at eval.in

代码:

<?php

// see http://phillihp.com/toolz/php-array-beautifier/ (takes an array or object output in PHP, such as a print_r() statement and formats it to be easily readable)
$s = unserialize('a:8:{i:0;a:3:{s:7:"field_1";s:9:"S. Miguel";s:7:"field_2";s:10:"Continente";s:5:"valor";s:1:"0";}i:1;a:3:{s:7:"field_1";s:9:"S. Miguel";s:7:"field_2";s:7:"Guarita";s:5:"valor";s:1:"0";}i:2;a:3:{s:7:"field_1";s:9:"S. Miguel";s:7:"field_2";s:8:"Manteiga";s:5:"valor";s:1:"0";}i:3;a:3:{s:7:"field_1";s:9:"S. Miguel";s:7:"field_2";s:6:"Solmar";s:5:"valor";s:1:"0";}i:4;a:3:{s:7:"field_1";s:8:"Terceira";s:7:"field_2";s:10:"Continente";s:5:"valor";s:1:"0";}i:5;a:3:{s:7:"field_1";s:8:"Terceira";s:7:"field_2";s:7:"Guarita";s:5:"valor";s:1:"0";}i:6;a:3:{s:7:"field_1";s:8:"Terceira";s:7:"field_2";s:8:"Manteiga";s:5:"valor";s:1:"0";}i:7;a:3:{s:7:"field_1";s:8:"Terceira";s:7:"field_2";s:6:"Solmar";s:5:"valor";s:1:"0";}}');
$t = unserialize('a:5:{i:0;a:3:{s:7:"field_1";s:9:"S. Miguel";s:7:"field_2";s:10:"Continente";s:5:"valor";s:3:"185";}i:1;a:3:{s:7:"field_1";s:9:"S. Miguel";s:7:"field_2";s:8:"Manteiga";s:5:"valor";s:3:"208";}i:2;a:3:{s:7:"field_1";s:9:"S. Miguel";s:7:"field_2";s:6:"Solmar";s:5:"valor";s:3:"187";}i:3;a:3:{s:7:"field_1";s:8:"Terceira";s:7:"field_2";s:10:"Continente";s:5:"valor";s:3:"192";}i:4;a:3:{s:7:"field_1";s:8:"Terceira";s:7:"field_2";s:7:"Guarita";s:5:"valor";s:3:"199";}}');

// var_dump($s, $t);

/*
 * Allow quick lookup of matching key from $t to $s by storing
 * a single key to the array index so we can do fast lookup and update.
 */
$mapSKeyToIdx = array();

/**
 * Two pass approach that that does not require sorted arrays.
 */

/**
 * First pass: create a 'lookup map' that allows easy matching of keys and accessing the related
 *             array entry quickly.
 *
 * I will use a 'hash' of the key and store the 'index' of the entry...
 */

foreach ($s as $key => $entry) {
    $mapSKeyToIdx[makeKey($entry['field_1'], $entry['field_2'])] = $key;
 }

/*
 * Second pass: Transfer 'valor' values from array $t to array  $s.
 *
 * Make it clear what i happening...
 */
 foreach ($t as $entry) {

     // current entry
     $tFieldKey = makeKey($entry['field_1'], $entry['field_2']);
     $tValor = $entry['valor'];

     // set values in array $s if the current $t key exists in $s...
     // we check via the $mapSKeyToIdx array to provide quick access

     if (array_key_exists($tFieldKey, $mapSKeyToIdx)) { // matching entry ...
         $s[$mapSKeyToIdx[$tFieldKey]]['valor'] = $tValor;
     }
 }

// var_dump($mapSKeyToIdx);

print_r($s);

exit;

// --------------------------------------------------------------------------
function makeKey($field1, $field2)
{
    return md5($field1 .'|'. $field2);
}
相关问题