【问题标题】:How to get difference between Associate arrays in PHP如何在 PHP 中获取关联数组之间的差异
【发布时间】:2018-06-15 09:37:40
【问题描述】:

我有一个这样的数组

Array
(
    [original_data] => Array
        (
            [0] => Array
                (
                    [reference_id] => 122
                    [id] => 121
                    [reference_name] => Dinesh
                )

            [1] => Array
                (
                    [reference_id] => 123
                    [id] => 120
                    [reference_name] => Dinesh Test
                )

        )

    [edited_data] => Array
        (
            [0] => Array
                (
                    [reference_id] => 123
                    [id] => 120
                    [reference_name] => Dinesh Test2
                )

        )

)

我想知道original_dataedited_data 数组之间的区别。怎么做?我尝试使用array_diff。但是,它没有正常工作。

【问题讨论】:

  • 你想要什么输出?请说明。
  • @JainamShah 输出需要为 [0] => 数组([reference_id] => 123 [id] => 120 [reference_name] => Balasuresh 测试)
  • 目前只是:$data['edited_data']。差异是什么意思?

标签: php arrays compare associative-array


【解决方案1】:

你可以得到差异=>

$result = ref_array_diff($requestedData['edited_data'], $requestedData['data']);

print_r($result);

function ref_array_diff($arraya, $arrayb) {
    foreach ($arraya as $keya => $valuea) {
        if (in_array($valuea, $arrayb)) {
            unset($arraya[$keya]);
        }
    }
    return $arraya;
}

【讨论】:

    【解决方案2】:

    如果您对原始数据和编辑数据都使用array_map 以获取 original_data id 值和edited_data id 值的数组。然后,您可以毫无问题地使用 array_diff。使用在一个但不在另一个中的 id 的结果列表,您可以使用原始数组上的数组映射值索引键查找原始值。

    我在这里假设您的 id 键是数据数组中每个值的唯一标识符。如果不是这种情况,您需要做一些嵌套循环来比较深度值

    【讨论】:

      【解决方案3】:

      这应该可行。

      <?php
      
      // your data
      $data = array (
          'original_data' => array
              ('0' => array
                  (
                      'reference_id' => 122,
                      'id' => 121,
                      'reference_name' => 'Balasuresh,'
                  ),
      
               '1' => array
                  (
                      'reference_id' => 123,
                      'id' => 120,
                      'reference_name' => 'Balasuresh',
                  ),
              ),
      
          'edited_data' => array
              ('0' => array
                  (
                     'reference_id' => 123,
                     'id' => 120,
                     'reference_name' => 'Balasuresh Test',
                  ),
              )
      
      ) ;
      
      
      // let's get our reference_ids
      $originalData = array() ;
      foreach($data['original_data'] as $entry) {
          $originalData[$entry['reference_id']] = $entry ;
      }
      
      // let's compare our edited data to our original data
      $editedData = array() ;
      foreach($data['edited_data'] as $editedEntry) {
          if (isset($originalData[$editedEntry['reference_id']])) {
              // for readability
              $compare = $originalData[$editedEntry['reference_id']] ;
              foreach($editedEntry as $key=>$value) { 
                  if ($compare[$key] != $value) {         
                      $editedData[$editedEntry['reference_id']][$key] = $value ; 
                  }
              }
          }
      }
      

      $editedData 现在包含您的差异

      【讨论】:

        【解决方案4】:

        这些是多维关联数组,您可以像这样递归地执行 array_diff_assoc: 你可以在这里查看此代码https://3v4l.org/ovaQB:

        function array_diff_assoc_recursive($array1, $array2)
        {
            foreach($array1 as $key => $value)
            {
                if(is_array($value))
                {
                    if(!isset($array2[$key]))
                    {
                        $difference[$key] = $value;
                    }
                    elseif(!is_array($array2[$key]))
                    {
                        $difference[$key] = $value;
                    }
                    else
                    {
                        $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
                        if($new_diff != FALSE)
                        {
                            $difference[$key] = $new_diff;
                        }
                    }
                }
                elseif(!isset($array2[$key]) || $array2[$key] != $value)
                {
                    $difference[$key] = $value;
                }
            }
            return !isset($difference) ? 0 : $difference;
        }
        
        $a=["original_data"=>[
                        [
                            'reference_id' => 122,
                            'id' => 121,
                            'reference_name' => 'Balasuresh'
                        ],[
                            'reference_id' => 123,
                            'id' => 120,
                            'reference_name' => 'Balasuresh'
                        ]
        
                ],
        
            'edited_data' => [[
                            'reference_id' => 123,
                            'id' => 120,
                            'reference_name' => 'Balasuresh Test'
                        ]]
        
        ];
        
        print_r(array_diff_assoc_recursive($a['edited_data'], $a['original_data']));
        

        输出:

        Array
        (
            [0] => Array
                (
                    [reference_id] => 123
                    [id] => 120
                    [reference_name] => Balasuresh Test
                )
        
        )
        

        【讨论】:

          猜你喜欢
          • 2021-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-14
          相关资源
          最近更新 更多