首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何正确处理数组?

如何正确处理数组?
EN

Stack Overflow用户
提问于 2018-08-08 04:07:23
回答 4查看 202关注 0票数 8

有两个数组:

代码语言:javascript
复制
$arr1 = ['word', 'tech', 'care', 'kek', 'lol', 'wild', 'regex'];
$arr2 = ['ord', 'ek', 'ol', 'ld', 'gex', 'ss'];

第二个数组中的元素数小于或等于第一个数组。

对第一个数组和第二个数组进行排序,如果第二个数组的元素包含在第一个数组的元素的末尾,则按以下形式对数组进行排序:

代码语言:javascript
复制
Array
(
    [0] => w_ord
    [1] => tech
    [2] => care
    [3] => k_ek
    [4] => l_ol
    [5] => wi_ld
    [6] => re_gex
)

重要提示:第二个数组的元素永远不会重复,并且可以按任何顺序进行。如果在第二个元素中没有第一个数组的元素的结尾,则设置第一个数组的元素的值。

我这样做:

代码语言:javascript
复制
foreach($arr2 as $val) {
    $strrepl[$val] = "_".$val;
}

foreach($arr1 as $key => $val) {
    $arr3[$key] = str_replace(array_keys($strrepl), $strrepl, $val);
}

print_r($arr3);

但我不确定这是不是正确的方法,你有什么建议?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-08 04:29:37

嗯,让我看看...纯函数式,因为你知道:D

代码语言:javascript
复制
function ends($str) {
  return function($suffix) use($str) {
    return mb_strlen($str) >= mb_strlen($suffix)
      && mb_substr($str, mb_strlen($suffix) * -1) === $suffix;
  };
}

$result = array_map(function($item) use($arr2) {
  $filter = ends($item);
  $suffixes = array_filter($arr2, $filter);

  if (empty($suffixes)) {
    return $item;
  }
  // This only cares about the very first match, but
  // is easily adaptable to handle all of them
  $suffix = reset($suffixes);

  return mb_substr($item, 0, mb_strlen($suffix) * -1) . "_{$suffix}";
}, $arr1);
票数 7
EN

Stack Overflow用户

发布于 2018-08-08 04:42:17

您可以使用preg_grep,它是数组上的正则表达式。

这段代码还将确保它可以从$arr1中输出多个匹配的单词。

代码语言:javascript
复制
$arr1 = ['word', 'chord', 'tech', 'care', 'kek', 'lol', 'wild', 'regex'];
$arr2 = ['ord', 'ek', 'ol', 'ld', 'gex', 'ss'];

$keys=[];
foreach($arr2 as $val){
    $matches = preg_grep("/.+" . preg_quote($val) . "/", $arr1);
    $keys = array_merge($keys, array_keys($matches)); // save keys of matched words
    foreach($matches as $key => $m) $new[$val][] = str_replace($val, "_$val", $arr1[$key]);
}
$new['unmatched'] = array_diff_key($arr1, array_flip($keys)); // add unmatched words
var_dump($new);

输出:

代码语言:javascript
复制
array(6) {
  ["ord"]=>
  array(2) {
    [0]=>
    string(5) "w_ord"
    [1]=>
    string(6) "ch_ord"
  }
  ["ek"]=>
  array(1) {
    [0]=>
    string(4) "k_ek"
  }
  ["ol"]=>
  array(1) {
    [0]=>
    string(4) "l_ol"
  }
  ["ld"]=>
  array(1) {
    [0]=>
    string(5) "wi_ld"
  }
  ["gex"]=>
  array(1) {
    [0]=>
    string(6) "re_gex"
  }
  ["unmatched"]=>
  array(2) {
    [2]=>
    string(4) "tech"
    [3]=>
    string(4) "care"
  }
}

https://3v4l.org/gfUea

票数 4
EN

Stack Overflow用户

发布于 2018-08-08 05:03:54

你可以试试这个。我认为这很容易理解:

代码语言:javascript
复制
$arr1=['word','tech','care','kek','lol','wild','regex'];
$arr2=['ord','ek','ol','ld','gex','ss'];

foreach($arr1 as $key=>$fullword){
    foreach($arr2 as $substr){
        $arr1[$key]=preg_replace('/' . $substr . '$/', '_' . $substr, $fullword,-1,$count);
        if($count) break;
    }
}

我遍历了完整的单词数组,一旦找到匹配,我就停止搜索。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51734635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档