php - 获取数组中项目的通用名称并保存每个项目的其余部分

标签 php arrays

我有一个项目数组,其中有 ID、名称等...我想获取它们的通用名称,并获取每个项目的其余名称。我制作了一个脚本,它得到了这个通用名称。这可能不是性能最好的,但它确实有效。这是代码:

$items = array(
    array(
        'id' => 1,
        'name' => 'Knife red big'
    ),
    array(
        'id' => 2,
        'name' => 'Knife blue big'
    ),
    array(
        'id' => 3,
        'name' => 'Knife green small'
    ),
);
$commonWords = array();

foreach($items as $key => $item) {
    $testWords = explode(' ', $item['name']);

    if(empty($commonWords)) {
        $commonWords = $testWords;
    } else {
        $newCommonWords = array();

        foreach($commonWords as $word) {
            if(in_array($word, $testWords)) {
                $newCommonWords[] = $word;
            }
        }

        $commonWords = $newCommonWords;
        $newItemName = str_replace(implode(' ', $commonWords), '', $item['name']);
        $items[$key]['altName'] = $newItemName;
    }
}

echo "<pre>";
print_r(array(
    'items' => $items,
    'commonName' => implode(' ', $commonWords)
));
echo "</pre>";

这就是我得到的:

Array
(
    [items] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [name] => Knife red big
                )

            [1] => Array
                (
                    [id] => 2
                    [name] => Knife blue big
                    [altName] => Knife blue big
                )

            [2] => Array
                (
                    [id] => 3
                    [name] => Knife green small
                    [altName] =>  green small
                )

        )

    [commonName] => Knife
)

我的目标是数组中的每个项目都将有新参数altName,其中将是其名称的其余部分,在本例中是除Knife之外的所有内容。即使是第一个,我怎样才能实现这样的目标?

最佳答案

诀窍是使用array_intersect构建常用词数组,以及 array_diff构建替代名称:

$items = array(
    array(
        'id' => 1,
        'name' => 'Knife red big'
    ),
    array(
        'id' => 2,
        'name' => 'Knife blue big'
    ),
    array(
        'id' => 3,
        'name' => 'Knife green small'
    ),
);
$commonWords = array();

foreach ($items as $k=>$item) {
    if ($k == 0)
        $commonWords = explode(' ', $item['name']);
    else
        $commonWords = array_intersect($commonWords, explode(' ', $item['name']));
}

foreach ($items as $k=>$item) {
    $name_array = explode(' ', $item['name']);
    $altName_array = array_diff($name_array, $commonWords);
    $items[$k]['altName'] = implode(' ', $altName_array);
}

var_dump($commonWords);
var_dump($items);

结果:

array (size=1)
  0 => string 'Knife' (length=5)

array (size=3)
  0 => 
    array (size=3)
      'id' => int 1
      'name' => string 'Knife red big' (length=13)
      'altName' => string 'red big' (length=7)
  1 => 
    array (size=3)
      'id' => int 2
      'name' => string 'Knife blue big' (length=14)
      'altName' => string 'blue big' (length=8)
  2 => 
    array (size=3)
      'id' => int 3
      'name' => string 'Knife green small' (length=17)
      'altName' => string 'green small' (length=11)

关于php - 获取数组中项目的通用名称并保存每个项目的其余部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39117658/

相关文章:

c - 使用 fscanf() 和数组

php - 对于 PHP 中的 DDD,我们如何准确保护非根聚合中实体上的方法?

php - 某些设备的无效 token

javascript - 如何通过隐藏/显示具有动态属性的 div 进行过滤?

PHP 代码无法运行

java - GUI 一次显示阵列的每个图像

php - 如何重置 laravel 用户删除中的自动增量?

java - 如何在 MySQL Workbench 中存储 10x10 map /游戏字段?

ruby - 根据索引在Ruby中将数组拆分为多个数组

php - 数组的 strpos