将两个二维数组中的唯一列值打印为<option>标签,并在相交值上声明“selected”属性

问题描述 投票:0回答:3

我有两个二维数组,如下所示:

$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
php arrays multidimensional-array html-select intersection
3个回答
1
投票

我会以不同的方式看待它。

//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>';

我会让数组自己处理它,如果它共享相同的密钥,它将合并,然后用“重复”标记它。


1
投票

如果每个数组中都没有任何重复项,则以下内容对我有用。这可能看起来有点复杂,但请阅读我的评论。

您可以复制代码并在其自己的页面中运行它,看看它是否按照您想要的方式工作。

<?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”,你将不会得到你想要的形式。但是,这适合您想要的。


0
投票

将两个数组中的列值隔离并展平为单个一维数组。 然后计算唯一值。然后循环生成的数组并打印出所需的 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>
© www.soinside.com 2019 - 2024. All rights reserved.