【问题标题】:Case insensitive unique multidimensional array loop不区分大小写的唯一多维数组循环
【发布时间】:2017-07-03 03:05:52
【问题描述】:

我正在尝试遍历一个多维数组并检索唯一值(不区分大小写),有人可以帮助我吗?

$shop = array(
            array(
                'Title' => "General enquiries", 
                'Phone' => 02085237289,
            ),
            array(
                'Title' => "general enquiries", 
                'email' => 'something@gmail.com',
            ),
            array(
                'Title' => "not enquiries", 
                'Phone' => 02039303039,
            ),
            array(
                'Title' => "Not enquiries", 
                'email' => 'blah@gmail.com',
            )
        );

这就是我想要创造的:

General Enquiries 
02085237289
something@gmail.com

Not enquiries
blah@gmail.com
02039303039 

到目前为止我已经尝试过:

$res = array();
foreach ($shop as $each) {
    array_push($res,strtolower($each['Title']));
    array_push($res,$each['email']);
    array_push($res,$each['Phone']);
}

$test =  array_unique($res);

foreach($test as $t){
    //echo $t;
}

【问题讨论】:

  • 一个问题是您如何决定选择哪个?对于General Enquiries,您选择了前者,而对于Not enquiries,您选择了后者。
  • 选择哪种情况?我不介意,它可以是任何一个,它只需要是姓名和联系人。

标签: php arrays multidimensional-array unique


【解决方案1】:

实现这一点的一种方法是使用两个数组,一个存储原始值,一个存储小写比较:

# Create comparison array
$compare    =   array();
# Create a final store array
$store      =   array();
# Loop main rows
foreach($shop as $row) {
    # Loop rows (don't hardcode, it may change later)
    foreach($row as $key => $value) {
        # Since case is fine, you can turn all to lower for comparison
        $lcValue    =   strtolower($value);
        # Check if not in comparison array already
        if(!in_array($lcValue,$compare)) {
            # If not, add lowercase version to $compare and add original to $store
            $store[]    =   $value;
            $compare[]  =   $lcValue;
        }
    }
}

print_r($store);

给你:

Array
(
    [0] => General enquiries
    [1] => 02085237289
    [2] => something@gmail.com
    [3] => not enquiries
    [4] => 02039303039
    [5] => blah@gmail.com
)

需要注意的是,您将如何知道要存储哪个版本,按照您拥有数组的顺序,不会获得Not enquiries 的大写版本,因为小写版本首先在循环中运行。你的例子是大写的,但你说它可以不区分大小写,所以我想这很好......

【讨论】:

    【解决方案2】:

    多亏了拉斯克拉特和刘昊天,我终于弄明白了。我想我应该把它放出来以防人们好奇。 谢谢大家!

    我稍微改变了数组,它看起来是这样的:

    Array
    (
        [0] => Array
            (
                [contact_description] => Employment support
                [contact_type] => Phone
                [contact] => 0300 456 8110
            )
    
        [1] => Array
            (
                [contact_description] => General enquiries
                [contact_type] => Phone
                [contact] => 0300 456 8052
            )
    
        [2] => Array
            (
                [contact_description] => employment support
                [contact_type] => Email
                [contact] => employmentservices.osc@remploy.co.u
            )
    
        [3] => Array
            (
                [contact_description] => general enquiries
                [contact_type] => Email
                [contact] => info@remploy.co.uk
            )
    
    )
    
     $res = array();
     foreach ($shop as $each) {
          $lcValue = strtolower($each['Title']);
           if (isset($res[$lcValue]))
               array_push($res[$lcValue], $each['contact']);
           else
              $res[$lcValue] = array($each['contact']);
       }
    
    
    
    
    foreach ($res as $name => $contact) {
                        echo '<h5 class="mb-0">' . ucwords($name) . '</h5>';
                        foreach ($contact as $contact) {
                            if (1 === preg_match('~[0-9]~', $contact)) {
                                // Phone Number
                                echo '<li class="work_number"><a href="tel:' . $contact . '">' . $contact . '</a></li>';
                            } elseif (strpos($contact, '@') !== false) {
                                //Email
                                echo '<li class="email"><a href="mailto:' . $contact . '" target="_blank">' . $contact . '</a></li>';
                            } else {
                                echo '<li><a>' . $contact . '</a></li>';
                            }
                        }
    
                    }
    

    【讨论】:

    • 如果这是接受的答案,您也可以接受您的答案。那么问题就不会被指定为未决问题。如果您感到慷慨并且我的回答很有帮助,我们将不胜感激,但没有必要……但我只会接受您自己的回答。
    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 2012-01-31
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2016-02-17
    • 2020-09-29
    相关资源
    最近更新 更多