我遇到处理数组的问题。我想“比较”两个数组,以查看两个数组中是否存在匹配的“用户名”。我不确定我是否正确使用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。
提前感谢您的帮助!
答案 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 :(得分: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']
);
}
}
}