Создать массив с ключом, если значения существуют в двух массивах?

У меня проблемы с обработкой массивов. Я хочу «сравнить» два массива, чтобы увидеть, совпадают ли «имена пользователей» в обоих массивах. Я не уверен, правильно ли я использую функцию in_array ()

вот так выглядят мои массивы:

USER массив 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.
Если они совпадают, я хочу создать массив с именем пользователя, станцией, 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.

Заранее спасибо за помощь!

-1

Решение

вместо понижения голоса может кто-нибудь подсказать, пожалуйста, что было бы лучше отредактировать

Во-первых, людям не нужно указывать причину отрицательного голоса, даже если бы они сделали, вы не обязательно получите что-то конструктивное, просто «я не согласен» — «вопрос плохой».

Во-вторых, вопрос не ясен на 100%, ваш код был немного шероховатым до редактирования и после того, как вы получили отрицательные голоса, и до сих пор неясен даже после редактирования.

Вы также не указываете, почему ваша текущая попытка не удалась, что она делает, что она должна делать и т. Д.

Проблемы

Похоже, что у ваших массивов нет соответствующих ключей, чтобы можно было что-либо связывать, особенно если учесть их 2-е измерение, пытаться получить доступ к значениям сечения, у которых нет соответствующих ключей, очень сложно.

Это не невозможно, но, учитывая огромный блок кода, необходимый для того, чтобы попытаться разобраться в ваших данных, это просто не практично. Переосмысление того, как вы используете данные, действительно необходимо.

НАПРИМЕР
У array_1 есть ключи «username» и «station», а у вашего array_2 есть ключи «memo_code» и «aht_value». Невозможно выполнить корреляцию из одной вещи в другую, используя ключи, потому что нет пар ключей из одного массива в другой.

Когда вы зацикливаете массив, скажем, array_1, вы можете получить совпадающее значение в array_2 из значения текущего цикла из array_1, но у вас нет индекса значения array_2, совпадающего с array_1, у вас просто есть значение, которое означает, что вы невозможно получить дополнительные данные из array_2, так как у вас есть только совпадение значения, а не индекс.

Это действительно грязно, особенно если учесть, что ваш сценарий действительно не достаточно сложен, чтобы оправдать такой сложный сценарий — фактически ни один сценарий не должен на самом деле делать вышеперечисленное, поскольку почти всегда есть лучший «подход», чем создание такого плохого «исправления».

Другое решение

Почему в array_2 есть ключ «memo_code», который выглядит как «username» из array_1?
Это должно быть так, как вы хотите объединить «имя пользователя» с «memo_code».
Так почему бы не использовать имя пользователя в array_2, если это так?

Идя дальше, опять я могу ошибаться, но это основано на информации в вашем вопросе — почему бы просто не иметь «aht_value» в array_1 и не иметь 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 и получите доступ ко 2-му массиву
    отдельно и найдите индекс соответствующего значения
  3. Используйте найденный индекс, чтобы получить дополнительные необходимые данные
  4. Добавить его в «новый» массив
  5. Начните снова проходить цикл

Надеюсь, что это поможет.

1

Другие решения

Я нашел решение после понимания массивов и ключевых значений … это два возможных ответа, если кто-то захочет сделать что-то подобное.

ответ 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']
);
}
}
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector