【问题标题】:Create an Array with a KEY if values exists in two arrays?如果两个数组中存在值,则使用 KEY 创建一个数组?
【发布时间】:2014-11-11 20:55:10
【问题描述】:

我在处理数组时遇到问题。我想“比较”两个数组,看看两个数组中是否有匹配的“用户名”。我不确定我是否正确使用了 in_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']                                                          
                            );
    }

MEMO 数组 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 数组中的“用户名”。 如果它们匹配,我想创建一个包含用户名、站、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 类型。

提前感谢您的帮助!

【问题讨论】:

  • 有人可以告诉我最好编辑什么而不是投票吗?
  • 看我的回答。鉴于您的设置,您的问题有点难以回答,尽管您的编辑使尝试提供帮助变得更容易:)

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


【解决方案1】:

有人可以告诉我什么是最好的编辑

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

其次,问题不是 100% 清楚,您的代码在编辑之前和获得反对票时有点粗糙,即使在编辑之后仍然不清楚。

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

问题

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

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

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 的“用户名”?
一定是因为您想将“用户名”与“备忘录代码”结合起来。
那么为什么在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" )
              );

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

如果你真的必须按照你要求的方式去做

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

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

希望这能有所帮助。

【讨论】:

  • 你好,我编辑了很多东西。关于两个数组的键值不同,您是对的。这就是为什么我将它们都更改为“用户名”。感谢您指出我提出的问题。现在我在遍历我的数组时遇到了一个新问题。再次感谢
  • 不用担心。很高兴能得到一些的帮助:)
【解决方案2】:

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

答案 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']
                                            );
         }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2021-04-14
    • 2021-12-19
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    相关资源
    最近更新 更多