2015-07-11 40 views
-1

我有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 
    ) 

我需要什么做的是对$s_array与值从key [valor]$r_array改变箱子key [valor]值,其他按键[field_1]和[field_2]具有两个阵列上的值相同。

感谢您的帮助。

回答

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"] 
    } 
} 

?> 
+0

问题是准确的是:这两个阵列不相同的尺寸。但你的回答打开了我的想法。感谢那。波纹管我共享一个可能的解决方案 –

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; 
     } 
    } 
} 
0

这里是一个程序,将有一个运行时间成本:

两遍.. 。

  • 一个连续向下传递每个源阵列
  • 的查找标签乐
  • A“钥匙”两个表中查找更新$ 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); 
} 
+0

谢谢瑞安你的清洁解决方案。 –