【问题标题】:Repeat data in array how to filter数组中的重复数据如何过滤
【发布时间】:2014-05-09 21:16:36
【问题描述】:

这是我的基本数组:

Array (
[1] => array
(
    [name] => Name1
    [midname] => MidN1
    [lastname] => LastN1
    [email] => email_1@email1.com

)
[2] => array
(
    [name] => Name2
    [midname] => MidN2
    [lastname] => LastN2
    [email] => email_1@email1.com

)
[3] => array
(
    [name] => Name1
    [midname] => MidN1
    [lastname] => LastN1
    [email] => email_2@email2.com

)

)

如您所见,在某些情况下我的姓名和电子邮件相同,其想法是仅显示一个数组,如下所示

[1] => array
(
    [name] => Name1
    [midname] => MidN1
    [lastname] => LastN1
    [email] => email_1@email1.com

)
[3] => array
(
    [name] => Name1
    [midname] => MidN1
    [lastname] => LastN1
    [email] => email_2@email2.com

)

您可以看到名称相同但电子邮件不同,因此这是从不同电子邮件中获取所有信息的想法,现在问题是存储了姓名、中间名、姓氏和电子邮件在单个列中作为 json 数组: 所以首先我:

$q = "SELECT * FROM table";
$r=$con->query($q);
$res = mysqli_fetch_array($r);
$arrs = json_decode($res);
print_r($arrs);

这就是我获取数组的方式......并且它们在 html 中显示为:
Name1 MidN1 LastN1 email_1@email1.com
Name2 MidN2 LastN2 email_1@email1.com
Name1 MidN1 LastN1 email_2@email2.com

我们的想法是只得到:
Name1 MidN1 LastN1 email_1@email1.com
Name1 MidN1 LastN1 email_2@email2.com

我尝试使用 array_unique($array);但返回空和 array_unique($array, SORT_REGULAR);这将输出整个内容,[1]=>array()... 是行中的 ID...

感谢您抽出宝贵时间。

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    我编辑了我的答案。 您可以像这样迭代您的 Json 结果:

    $my_array = array();
    foreach ($arrs as $key => $value) {
        if (!in_array($value['email'], $my_array)){
            $my_array[] = $value['email'];
        }
    }
    

    但是我想知道为什么将 Json 字符串存储在 DB 字段中而不是使用每个属性的字段...

    【讨论】:

    • 我认为如果我的表是 ID 会起作用 |姓名 | EMAIL |...但不是,我只有ID |数据 | ...在数据中,我有一个包含所有信息的 json ...但是谢谢。
    • @Tanker 为什么一开始就将所有数据存储到一个列中,这是您使用的框架所做的吗?
    • 不,那是我之前的其他人,整个系统都在使用该阵列,因为您可以看到成像充满错误、不完整且难以管理...我将迁移整个系统使用新的数据库和代码,但现在我必须修复它...谢谢。
    【解决方案2】:

    如果您无法更改表定义或查询,快速解决方案: 1)制作一个数组,其中名字,中间名和姓氏是主键 (问题是两个 John Junior Smith)

    $arr= array (
    '1' => array
    (
    'name' => 'Name1',
    'midname' => 'MidN1',
    'lastname' => 'LastN1',
    'email' => 'email_1@email1.com'
    
    ),
    '2' => array
    (
    'name' => 'Name2',
    'midname' => 'MidN2',
    'lastname' => 'LastN2',
    'email' => 'email_1@email1.com'
    
    ),
    '3' => array
    (
    'name' => 'Name1',
    'midname' => 'MidN1',
    'lastname' => 'LastN1',
    'email' => 'email_2@email2.com'
    
    )
    
    );
    $people = array();
    foreach($arr as $v){
    $people[$v['name'].' '.$v['name'].' '.$v['name']][] = $v['email'];
    }
    ksort($people); // if it is not ordered by mysql
    echo '<table border="1">';
    foreach( $people as $k => $val){
    echo "<tr><td>$k</td><td>";
    foreach($val as $email){
    echo $email.'<br>';
    }
    echo '</td></tr>';
    
    }
    echo '</table>';
    

    另一种解决方案是在定义排序标准的地方使用 usort。

    【讨论】:

    • 您好,我想您误解了我的问题,您刚刚发布的内容有点像我已经发布的内容,除了第一个 foreach ...我缺少的是第二个数组和 IF ...就像@Slyvain 说的......但是谢谢。
    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2018-12-07
    • 1970-01-01
    • 2021-10-25
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多