【问题标题】:remove array by matching two array通过匹配两个数组来删除数组
【发布时间】:2017-12-15 00:05:44
【问题描述】:

通过匹配两个数组来删除数组。一种是简单数组,另一种是多维数组。如果第一个数组中不存在值,我想删除第二个数组的元素。所以第一个数组中总共有 20 个元素。所以第二个数组中只有 20 个元素。

我想要的最终结果,其中值应与 Ist 数组匹配。第二个数组中没有元素的值与第一个数组中的值不匹配。所以只有第二个数组的元素与第一个数组的值匹配。

           Array
(
[0] => Array
    (
        [label] => Afrikaans
        [value] => af
    )

[1] => Array
    (
        [label] => Albanian
        [value] => sq
    )

[2] => Array
    (
        [label] => Arabic
        [value] => ar
    )

[3] => Array
    (
        [label] => Armenian
        [value] => hy
    )

[4] => Array
    (
        [label] => Azerbaijani
        [value] => az
    )

 [5] => Array
    (
        [label] => Basque
        [value] => eu
     )

 [6] => Array
    (
        [label] => Belarusian
        [value] => be
    )

[7] => Array
    (
        [label] => Bengali
        [value] => bn
    )

[8] => Array
    (
        [label] => Bosnian
        [value] => bs
    )

[9] => Array
    (
        [label] => Bulgarian
        [value] => bg
    )

[10] => Array
    (
        [label] => Catalan
        [value] => ca
    )

[11] => Array
    (
        [label] => Cebuano
        [value] => ceb
    )

[12] => Array
    (
        [label] => Chinese
        [value] => zh-CN
    )

[13] => Array
    (
        [label] => Chinese (Traditional)
        [value] => zh-TW
    )

[14] => Array
    (
        [label] => Croatian
        [value] => hr
    )

[15] => Array
    (
        [label] => Czech
        [value] => cs
    )

[16] => Array
    (
        [label] => Danish
        [value] => da
    )

[17] => Array
    (
        [label] => Dutch
        [value] => nl
    )

[18] => Array
    (
        [label] => English
        [value] => en
    )

[19] => Array
    (
        [label] => Esperanto
        [value] => eo
    )

[20] => Array
    (
        [label] => Estonian
        [value] => et
    )

第一个数组

      Array
(
[0] => ar
[1] => bn
[2] => zh-CN
[3] => en
[4] => fr
[5] => de
[6] => el
[7] => gu
[8] => hi
[9] => it
[10] => ja
[11] => kn
[12] => ko
[13] => la
[14] => mr
[15] => pa
[16] => ru
[17] => es
[18] => ta
[19] => te
[20] => ur
)

第二个数组

   Array
(
[0] => Array
    (
        [label] => Afrikaans
        [value] => af
    )

[1] => Array
    (
        [label] => Albanian
        [value] => sq
    )

[2] => Array
    (
        [label] => Arabic
        [value] => ar
    )

[3] => Array
    (
        [label] => Armenian
        [value] => hy
    )

[4] => Array
    (
        [label] => Azerbaijani
        [value] => az
    )

 [5] => Array
    (
        [label] => Basque
        [value] => eu
     )

 [6] => Array
    (
        [label] => Belarusian
        [value] => be
    )

[7] => Array
    (
        [label] => Bengali
        [value] => bn
    )

[8] => Array
    (
        [label] => Bosnian
        [value] => bs
    )

[9] => Array
    (
        [label] => Bulgarian
        [value] => bg
    )

[10] => Array
    (
        [label] => Catalan
        [value] => ca
    )

[11] => Array
    (
        [label] => Cebuano
        [value] => ceb
    )

[12] => Array
    (
        [label] => Chinese
        [value] => zh-CN
    )

[13] => Array
    (
        [label] => Chinese (Traditional)
        [value] => zh-TW
    )

[14] => Array
    (
        [label] => Croatian
        [value] => hr
    )

[15] => Array
    (
        [label] => Czech
        [value] => cs
    )

[16] => Array
    (
        [label] => Danish
        [value] => da
    )

[17] => Array
    (
        [label] => Dutch
        [value] => nl
    )

[18] => Array
    (
        [label] => English
        [value] => en
    )

[19] => Array
    (
        [label] => Esperanto
        [value] => eo
    )

[20] => Array
    (
        [label] => Estonian
        [value] => et
    )

[21] => Array
    (
        [label] => Filipino
        [value] => tl
    )

[22] => Array
    (
        [label] => Finnish
        [value] => fi
    )

[23] => Array
    (
        [label] => French
        [value] => fr
    )

[24] => Array
    (
        [label] => Galician
        [value] => gl
    )

[25] => Array
    (
        [label] => Georgian
        [value] => ka
    )

[26] => Array
    (
        [label] => German
        [value] => de
    )

[27] => Array
    (
        [label] => Greek
        [value] => el
    )

[28] => Array
    (
        [label] => Gujarati
        [value] => gu
    )

[29] => Array
    (
        [label] => Haitian
        [value] => ht
    )

[30] => Array
    (
        [label] => Hausa
        [value] => ha
    )

[31] => Array
    (
        [label] => Hebrew
        [value] => iw
    )

[32] => Array
    (
        [label] => Hindi
        [value] => hi
    )

[33] => Array
    (
        [label] => Hmong
        [value] => hmn
    )

[34] => Array
    (
        [label] => Hungarian
        [value] => hu
    )

[35] => Array
    (
        [label] => Icelandic
        [value] => is
    )

[36] => Array
    (
        [label] => Igbo
        [value] => ig
    )

[37] => Array
    (
        [label] => Indonesian
        [value] => id
    )

[38] => Array
    (
        [label] => Irish
        [value] => ga
    )

[39] => Array
    (
        [label] => Italian
        [value] => it
    )

[40] => Array
    (
        [label] => Japanese
        [value] => ja
    )

[41] => Array
    (
        [label] => Javanese
        [value] => jv
    )

[42] => Array
    (
        [label] => Kannada
        [value] => kn
    )

[43] => Array
    (
        [label] => Khmer
        [value] => km
    )

[44] => Array
    (
        [label] => Korean
        [value] => ko
    )

[45] => Array
    (
        [label] => Lao
        [value] => lo
    )

[46] => Array
    (
        [label] => Latin
        [value] => la
    )

[47] => Array
    (
        [label] => Latvian
        [value] => lv
    )

[48] => Array
    (
        [label] => Lithuanian
        [value] => lt
    )

[49] => Array
    (
        [label] => Macedonian
        [value] => mk
    )

[50] => Array
    (
        [label] => Malay
        [value] => ms
    )

[51] => Array
    (
        [label] => Maltese
        [value] => mt
    )

[52] => Array
    (
        [label] => Maori
        [value] => mi
    )

[53] => Array
    (
        [label] => Marathi
        [value] => mr
    )

[54] => Array
    (
        [label] => Norwegian
        [value] => no
    )

[55] => Array
    (
        [label] => Persian
        [value] => fa
    )

[56] => Array
    (
        [label] => Polish
        [value] => pl
    )

[57] => Array
    (
        [label] => Portuguese
        [value] => pt
    )

[58] => Array
    (
        [label] => Punjabi
        [value] => pa
    )

[59] => Array
    (
        [label] => Romanian
        [value] => ro
    )

[60] => Array
    (
        [label] => Russian
        [value] => ru
    )

[61] => Array
    (
        [label] => Serbian
        [value] => sr
    )

[62] => Array
    (
        [label] => Slovak
        [value] => sk
    )

[63] => Array
    (
        [label] => Slovenian
        [value] => sl
    )

[64] => Array
    (
        [label] => Somali
        [value] => so
    )

[65] => Array
    (
        [label] => Spanish
        [value] => es
    )

[66] => Array
    (
        [label] => Swahili
        [value] => sw
    )

[67] => Array
    (
        [label] => Swedish
        [value] => sv
    )

[68] => Array
    (
        [label] => Tamil
        [value] => ta
    )

[69] => Array
    (
        [label] => Telugu
        [value] => te
    )

[70] => Array
    (
        [label] => Thai
        [value] => th
    )

[71] => Array
    (
        [label] => Turkish
        [value] => tr
    )

[72] => Array
    (
        [label] => Ukrainian
        [value] => uk
    )

[73] => Array
    (
        [label] => Urdu
        [value] => ur
    )

[74] => Array
    (
        [label] => Vietnamese
        [value] => vi
    )

[75] => Array
    (
        [label] => Welsh
        [value] => cy
    )

[76] => Array
    (
        [label] => Yiddish
        [value] => yi
    )

[77] => Array
    (
        [label] => Yoruba
        [value] => yo
    )

[78] => Array
    (
        [label] => Zulu
        [value] => zu
    )

  )

Example

【问题讨论】:

  • 你尝试了什么,可以分享一下吗?
  • 澄清一下:最底部的数组,有 79 个条目,是您的输入数据,您想使用中间的一维数组来过滤它,以及您的第一个数组问题是预期的输出?但似乎您问题的第一个和第二个数组的条目,即过滤器和结果数组,不匹配,例如"af" 在第一个和第三个数组中,但不在第二个数组中。
  • 我已经添加了例如链接

标签: php arrays filtering


【解决方案1】:
$a1 = your first array;
$a2 = second array;

foreach($a2 as $k => $v)
{
    if(!in_array($v['value'],$a1)
    {
        unset($a2[$k]);
    }
}

因此,您将拥有 $a2 以及 $a1 中唯一剩余的值。

【讨论】:

  • 如何得到最终数组?
  • 在查看 foreach 之后,如果您执行 print_r($a2);,您将看到您的 $a2 是所需的数组。
【解决方案2】:

假设您不需要保留第二个数组中的索引,您可以翻转第一个数组并将临时键分配给第二个数组并调用array_intersect_key()

虽然这似乎进行了多次函数调用,但它们都不是在循环中完成的。在循环内使用 in_array() 将意味着(在您的情况下)php 将进行 59 次全数组扫描和 20 次部分扫描——这将不会有效。

代码:(Demo)

var_export(  // print to screen
    array_values(  // this is optional.  This just reindexes the array
        array_intersect_key(  // retain elements where key exists in both arrays
            array_column($fulllist,null,'value'),  // make new keys for 2nd array
            array_flip($keep)  // swap values and indexes of 1st array
        )
    )
);

输出:

array (
  0 => 
  array (
    'label' => 'Arabic',
    'value' => 'ar',
  ),
  1 => 
  array (
    'label' => 'Bengali',
    'value' => 'bn',
  ),
  2 => 
  array (
    'label' => 'Chinese',
    'value' => 'zh-CN',
  ),
  3 => 
  array (
    'label' => 'English',
    'value' => 'en',
  ),
  4 => 
  array (
    'label' => 'French',
    'value' => 'fr',
  ),
  5 => 
  array (
    'label' => 'German',
    'value' => 'de',
  ),
  6 => 
  array (
    'label' => 'Greek',
    'value' => 'el',
  ),
  7 => 
  array (
    'label' => 'Gujarati',
    'value' => 'gu',
  ),
  8 => 
  array (
    'label' => 'Hindi',
    'value' => 'hi',
  ),
  9 => 
  array (
    'label' => 'Italian',
    'value' => 'it',
  ),
  10 => 
  array (
    'label' => 'Japanese',
    'value' => 'ja',
  ),
  11 => 
  array (
    'label' => 'Kannada',
    'value' => 'kn',
  ),
  12 => 
  array (
    'label' => 'Korean',
    'value' => 'ko',
  ),
  13 => 
  array (
    'label' => 'Latin',
    'value' => 'la',
  ),
  14 => 
  array (
    'label' => 'Marathi',
    'value' => 'mr',
  ),
  15 => 
  array (
    'label' => 'Punjabi',
    'value' => 'pa',
  ),
  16 => 
  array (
    'label' => 'Russian',
    'value' => 'ru',
  ),
  17 => 
  array (
    'label' => 'Spanish',
    'value' => 'es',
  ),
  18 => 
  array (
    'label' => 'Tamil',
    'value' => 'ta',
  ),
  19 => 
  array (
    'label' => 'Telugu',
    'value' => 'te',
  ),
  20 => 
  array (
    'label' => 'Urdu',
    'value' => 'ur',
  ),
)

【讨论】:

    【解决方案3】:

    简单(如果我能理解的话……)

    let newArray = languages.filter(lang => return codes.indexof(lang.value) !== -1);
    

    更新

    哦,天哪 :-) 语言错误,抱歉

    $final = array_filter($languages, function($language) use($codes) { return in_array($language['value'], $codes)});
    

    更新 2

    让我们停下来:

    array_filter 可用于过滤数组 :-),默认情况下,array_filter 将删除“虚假”值。使用回调作为第二个参数,您可以定义如何过滤输入数组。第一个参数是输入数组。

    我使用 array_filter 而不是取消设置原始值,因为它更简洁、更健壮。

    PHP 知道匿名函数——过滤器操作是一个完美的用例。但是因为 PHP 不是目前最好的编程语言,我们必须使用一种特殊的语法来模拟某种范围,这就是你看到这部分的原因:

    use($codes)
    

    如果我将过滤器定义为:

    $final = array_filter($languages, function($language) {
        return in_array($language['value'], $codes)
    });
    

    PHP 会抛出异常,因为 $codes 未在函数范围内定义。

    匿名函数支持 use() 块,这样我们就可以将代码数组“公开”给我们的函数。

    $final = array_filter($languages, function($language) use($codes) {
        return in_array($language['value'], $codes)
    });
    

    最后,我们通过在 $codes 数组中搜索语言值来检查语言是否有效(它将保存允许的语言)。如果代码在 $codes in_array 中不存在,将返回false,我们将其返回给array_filter,因此该元素无效。

    如果codes中存在被检查语言的code,in_array会返回true,我们返回给array_filter,item有效。

    【讨论】:

    • 抱歉,今天编码太多了...添加了 php sn-p。谢谢
    猜你喜欢
    • 2022-11-02
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2020-10-11
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多