我有两个二维数组,如下所示:
$users = [
['username' => 'Timothy'],
['username' => 'Frederic']
];
$users2 = [
['username' => 'Johnathon'],
['username' => 'Frederic'],
['username' => 'Peter']
];
我试图将每个数组的内容相互比较,以便编写 html 元素。我尝试使用嵌套的 foreach ,如下所示:
foreach ($users as $user) {
foreach ($users2 as $user2) {
if ($user['username'] == $user2['username']) {
echo "<option value=' " . $user['username'] . "' selected = 'selected'>" . $user['username'] . "</option>";
break;
} else {
echo "<option value=' " . $user['username'] . "'>" . $user['username'] . "</option>";
}
}
}
我的问题是这些项目多次回显,这破坏了我的选择元素。关于如何比较每个内容而不打印重复选项的任何想法?
我想获得每个名字的列表,例如:
-Timothy
-Frederic (this should be highlighted as it is in both arrays)
-Johnathon
- Peter
我会以不同的方式看待它。
//Create user array one
$users = array();
$users[] = array('username'=>'Timothy');
$users[] = array('username'=>'Frederic');
//create user array 2
$users2 = array();
$users2[] = array('username'=>'Johnathon');
$users2[] = array('username'=>'Frederic');
$users2[] = array('username'=>'Peter');
$temp_array = array();
foreach($users as $key => $value) {
$temp_array[$value['username']] = '';
}
foreach($users2 as $key => $value) {
$temp_array[$value['username']] = array_key_exists($value['username'], $temp_array) ? 'DUPLICATE' : null;
}
echo '<select>';
foreach($temp_array as $key_value => $status) {
echo "<option value='{$key_value}' ".(($status == 'DUPLICATE') ? 'selected style="background-color: yellow;"' : '').">{$key_value}</option>";
}
echo '</select>';
我会让数组自己处理它,如果它共享相同的密钥,它将合并,然后用“重复”标记它。
如果每个数组中都没有任何重复项,则以下内容对我有用。这可能看起来有点复杂,但请阅读我的评论。
您可以复制代码并在其自己的页面中运行它,看看它是否按照您想要的方式工作。
<?php
//Create user array one
$users = array();
$users[] = array('username'=>'Timothy');
$users[] = array('username'=>'Frederic');
//create user array 2
$users2 = array();
$users2[] = array('username'=>'Johnathon');
$users2[] = array('username'=>'Frederic');
$users2[] = array('username'=>'Peter');
//create a new array to combine all of the data, yes, there will be duplicates
$allData = array();
//add to allData array
foreach ($users as $user) {
$allData[] = $user['username'];
}
//add to allData array
foreach ($users2 as $user2) {
$allData[] = $user2['username'];
}
//create an array that will hold all of the duplicates
$dups = array();
//add any duplicates to the array
foreach(array_count_values($allData) as $val => $c) {
if($c > 1) $dups[] = $val;
}
//remove the duplicates from the allData array
$allData = array_unique($allData);
//echo out form
echo '<select>';
foreach ($allData as $user) {
if (in_array($user, $dups)) {
echo "<option value=' ".$user."' selected = 'selected'>".$user."</option>";
}
else {
echo "<option value=' ".$user."'>".$user."</option>";
}
}
echo '</select>';
?>
但是,我不确定你的意图是什么,因为如果你在两个数组中都有“Peter”和“Frederic”,你将不会得到你想要的形式。但是,这适合您想要的。
将两个数组中的列值隔离并展平为单个一维数组。 然后计算唯一值。然后循环生成的数组并打印出所需的 HTML。
请注意,重复选项标签的文本作为其
value
属性毫无价值——这是不必要的标记膨胀。 换句话说,如果值与标签的可见文本不同,则仅在选项标签中声明 value
属性。
代码:(演示)
$counts = array_count_values(
[
...array_column($users, 'username'),
...array_column($users2, 'username')
]
);
foreach ($counts as $user => $count) {
printf(
"<option%s>%s</option>\n",
$count > 1 ? ' selected' : '',
htmlentities($user)
);
}
输出:
<option>Timothy</option>
<option selected>Frederic</option>
<option>Johnathon</option>
<option>Peter</option>