【问题标题】:How to loop over an array and conditionally update a nested value如何遍历数组并有条件地更新嵌套值
【发布时间】:2015-12-11 03:31:48
【问题描述】:

我有两个数组,例如:

array (size=4)
 0 => string '5' (length=1)
 1 => string '4' (length=1)
 2 => string '2' (length=1)
 3 => string '2' (length=1)
 3 => string '8' (length=1)

还有一个我从 XML 文件加载的数组:

object(SimpleXMLElement)[1]
public 'book' => 
array (size=101)
  0 => 
    object(SimpleXMLElement)[2]
      public 'id' => string '1' (length=1)
      public 'title' => string 'p' (length=1)
  1 => 
    object(SimpleXMLElement)[3]
      public 'id' => string '2' (length=1)
      public 'title' => string 'pp' (length=2)
  2 => 
    object(SimpleXMLElement)[4]
      public 'id' => string '3' (length=1)
      public 'title' => string 'pen' (length=3)
  3 => 
    object(SimpleXMLElement)[5]
      public 'id' => string '4' (length=1)
      public 'title' => string 'lapton' (length=6)
      ......
      ......
  101 => 
    object(SimpleXMLElement)[103]
      public 'id' => string '101' (length=1)
      public 'title' => string 'title' (length=5)

我想将第二个数组的键 id 的每个值与每个值的第一个数组的键进行比较。当它相同时,我想更新第二个数组的键title的值。

【问题讨论】:

  • PHP compare array的可能重复
  • 我认为不一样,就我而言,我想比较每个数组的每个值。就像多对多

标签: php arrays


【解决方案1】:

假设你的第一个数组是$idArray,第二个是$xmlArray,你可以使用这样的东西。

$result = array_map(function($xmlElement) use ($idArray) {
    if (in_array($xmlElement->id, $idArray)) {
      $xmlElement->title = 'updated value';
    }
    return $xmlElement;
}, $xmlArray);

【讨论】:

    【解决方案2】:

    假设

    • 第一个数组被称为$array1
    • 第二个数组被称为$fromXML
    • 第二个数组实际上并不是一个数组,它是一个 SimpleXMLElement,具有以下结构(伪代码/JSONish 语法)
    {
      'book' => {
        0 => SimpleXMLElement {
          'id' => 1,
          'title' => 'p'
        }
      }
    }
    
    • 我假设您可以使用$fromXML['book'] 访问第二个元素数组
    • 我假设您可以使用$fromXML['book'][0]['id'] 访问第一个元素的属性
    • 我假设您可以将第一个元素的标题文本设置为$fromXML['book'][0]['title'][0] = 'new title'

    基于How can I set text value of SimpleXmlElement without using its parent?PHP SimpleXML, how to set attributes?PHP foreach change original array values

    解决方案

    foreach($fromXML['book'] as $key => $element) {
      if(array_key_exists($element['id'], $array1)) {
        $fromXML['book'][$key]['title'][0] = $array1[$element->id];
      }
    }
    

    注意事项和故障排除

    我没有对此进行测试,只是脱离了文档。如果我误解了 SimpleXMLElement 数组的结构,请尝试使用 var_dump($fromXML['some']['key']) 进行试验,直到找到访问数组/元素的正确方法

    注意:显然,array_key_exists() performs better than in_array() on large arrays

    【讨论】:

      【解决方案3】:

      现在试试这个

      foreach($array1 as $arr1 => $val1){
        foreach($array2 as $arr2 =>$val2){
          if($arr1==$arr2){
              $val2['title']='update value';
          }    
        }
      }
      

      【讨论】:

      • 你的解决方案,它适合我。只要加上你的答案,现在就可以了
      • 我指的是那个投反对票的人。 @ching 很高兴知道它现在正在工作。
      • 为什么要遍历$array1?这意味着你对$array1 的每个值循环一次$array2$array 中的每个新元素都意味着循环 100 次以上....@Ben Rowe 和我都使用了in_array($key, $array1) - 我认为这是一个更简洁、更具描述性的方式。
      • 我同意 in_array 是更简洁的方式,但我的解决方案真的值得否决吗?而且您没有在解决方案中使用 in_array。
      • 你是对的——但我使用了array_key_exists(),它基本上做同样的事情(尽管apparently it performs better on large arrays than in_array does)。而且我没有投反对票,所以我无法解释你为什么投反对票
      猜你喜欢
      • 2021-08-18
      • 2010-12-06
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 2016-10-08
      相关资源
      最近更新 更多