如果两个数组中存在值,则使用KEY创建一个数组?

时间:2014-11-11 20:55:10

标签: php arrays multidimensional-array mysqli associative-array

我遇到处理数组的问题。我想“比较”两个数组,以查看两个数组中是否存在匹配的“用户名”。我不确定我是否正确使用in_array()函数

这就是我的数组的样子:

USER array 1:

 Array ( [0] => Array ( [username] => LNDP [station] => D08 ) 
        [1] => Array ( [username] => ACMAN [station] => D06 )
        [2] => Array ( [username] => VTER [station] =>  D13 )
      )

    //the users will have to be matched with memo_code
    $user = array();
    while($row = mysqli_fetch_assoc($get_user_result)){
        $user[] = array( "username" => $row['username'],
                         "station"  =>  $row['station_number']                                                          
                            );
    }

备忘录阵列2:

 Array (   [0] => Array ( [username] => VTER[aht_value] =>  333 ) 
           [1] => Array ( [username] => ACMAN [aht_value] => 456 ) 
           [2] => Array ( [username] => ACYL [aht_value] =>  789 )
         )


$memo = array();
    while ($row = mysqli_fetch_assoc($dbh2_result)){   
        $memo[] = array( "username"  => $row['memo_code'],
                       "aht_value" => $row['avg_handle_time']
                      );
    }

我想检查MEMO数组中的每个“用户名”以匹配USER数组中的“用户名”。 如果它们匹配,我想创建一个带有username,station,aht_value的数组,如下所示:

Array ( [0] => Array ( [username] => ACMAN [aht_value] => 456 [station] => D06 ) 
      )

//creating array 3 by comparing 1 and 2 by using key value of "username" from array 2
    $result = array();
    //$m = key
    //$m['username'] = key value
    foreach($memo as $m => $m['username']){

        //if username in array 2 is in array 1
        if( in_array( $m, $user) ){
            //if aht_value is not null
            if( $memo['aht_value'] != null ){
            $result[] =  "username: " . $user['username'] . "aht_value: " .$m['aht_value'] . "position: " . $user['position']. "<br>";   
            }
            //else if aht_value is null
            else{
                $result[] = "username: " . $user['username'] . "aht_value: NA  position: " . $user['position'] . "<br>";
            }
        }
        //if there is no matching username do something?
        else{
            echo "no match";
        }

    }

    $final_result = json_encode($result);
    echo $final_result;

错误消息

Warning: Cannot use a scalar value as an array in line 97 : 
foreach($memo as $m => $m['username']){

如果我需要澄清一些事情,请询问。在成功创建第三个数组后,我将使用json_encode进行AJAX调用并使用类型GET。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

  

而不是downvoting有人可以请告诉我最好编辑

首先,人们不需要提供downvote的理由,即使他们这样做你也不一定会得到任何建设性的东西,只是“我不同意” - “问题很糟糕”。

其次,问题不是100%明确,你的代码在编辑之前以及当你得到downvotes时有点粗糙,并且即使在编辑之后仍然不清楚。

你也没有说明为什么你当前的尝试失败,它做了什么,它应该做什么,等等。

问题

您的数组似乎没有匹配的键可以配对任何东西,特别是考虑到它们的第二维,尝试访问没有匹配键的横截面值非常复杂。

这并非不可能,但考虑到试图理解您的数据所需的巨大代码块,这是不切实际的。真的需要重新考虑如何使用数据。

EG
array_1具有“username”和“station”的键,但是你的array_2具有“memo_code”和“aht_value”的键。由于没有从一个数组到另一个数组的键对,所以无法使用键将一个事物关联到另一个事物。

当你循环一个数组时,比如array_1,你可以从array_1的当前循环值得到array_2中的匹配值,但是你没有从array_1匹配的array_2值的索引,你只需要值,这意味着您无法从array_2获取其他数据,因为您只有值匹配,而不是索引。

这很麻烦,真的,特别是考虑到你的情景真的不够复杂,无法保证如此复杂的情况 - 实际上没有任何情况应该真正做到这一点,因为几乎总是有一种更好的“方法”,而不是产生这么差的“固定”。

其他解决方案

为什么在array_2中有一个键“memo_code”,它似乎是来自array_1的“用户名”?
它必须是你想要将“用户名”与“memo_code”结合起来 那么为什么不在array_2中使用“用户名”,如果它是什么呢?

更进一步,我可能错了,但这是基于你问题中的信息 - 为什么不在array_1中有“aht_value”并且没有array_2?

也许需要两个阵列,但是你的问题没有显示,但是我从你的(令人困惑和一点点乱码)问题得到的是,这“可能”没问题:

$single_array = array 
    ( "0" => Array ( "username" => "LNDP", "station" => "D08", "aht_value" => "whatever") 
      "1" => Array ( "username" => "ACMAN", "station" => "D06", "aht_value" => "something" )
      "2" => Array ( "username" => "VTER", "station" => "D13", "aht_value" => NULL )
    );

您可以一次性获取与一个用户名相关的所有值,即使它们位于不同的表上也只是进行连接(我假设您在两个表之间有外键/关系。

如果您需要两个数组

如果您需要保留两个阵列(无论出于何种原因,您的场景需要)并且您无法更改此方法,那么您至少可以更改它以在每个阵列中使用某种相应的索引吗? 然后,您可以匹配另一个索引,然后从匹配对中获取数据。

例如您的索引可以是用户名:

$user = array ( "LNDP" => Array ( "station" => "D08" ) 
                "ACMAN" => Array ( "station" => "D06" )
                "VTER" => Array ( "station" => "D13" )
              );


$memo = array ( "VTER" => Array ( "aht_value" => ""  ) 
                "ACMAN" => Array ( "aht_value" => "456" ) 
                "ACYL" => Array ( "aht_value" =>  "789" )
              );

然后循环其中一个数组,并且index(username)匹配,您可以轻松地从该索引获取其余数据并将其附加到新数组。

如果你真的必须按照你的要求

进行

同样,这并非不可能,但你需要一大堆代码:

  1. 循环array_1并从中获取array_2中的匹配值对 当前循环的值
  2. 使用array_2中标识的值并访问第二个数组 分别找到匹配值的索引
  3. 使用找到的索引获取所需的其他数据
  4. 将其附加到“新”数组
  5. 再次开始循环

  6. 希望其中一些有用。

答案 1 :(得分:0)

我在理解了数组和键值之后找到了解决方案..如果有人想要做类似的事情,这两个可能的答案。

回答1:

foreach ($memo as $i => $memodata) {
    foreach ($user as $j => $userdata) {
    if ($memodata['username'] == $userdata['username']) {
        if (is_null($memodata['aht_value'])) {
        $result[] = "username: " . $userdata['username'] . " aht_value: NA  position: " . $userdata['station'];
      } 
      else {
        $result[] =  "username: " . $userdata['username'] . " aht_value: " .$memodata['aht_value'] . " position: " . $userdata['station'];   
      }
    } 
    }

回答2:

foreach ($memo as $username => $memodata) {
    if (in_array($username, array_keys($user))) {
        // Match username against the keys of $user (the usernames) 
        $userdata = $user[$username];
        if (is_null($memodata['aht_value'])) {
            $result[] = array( 'username'  => $userdata['username'],
                                             'aht_value' => 'NA',
                                             'station'  => $userdata['station']
                                            );
        } 
    else {
        $result[] = array( 'username'  => $userdata['username'],
                                             'aht_value' => substr($memodata['aht_value'],0,-3),
                                             'station'   => $userdata['station']
                                            );
         }
    }
}