【问题标题】:PHP add counter to name if already exists in array如果数组中已存在 PHP,则将计数器添加到名称中
【发布时间】:2015-12-15 15:04:33
【问题描述】:

我有以下多维数组,我需要对其进行迭代,只要有重复的名称,就会在名称中添加一个计数器。

[1] => Array
    (
        [0] => Array
            (
                [clientName] => John Smith
                [clientType] => 0
                [clientDOB] => 1980-10-14
            )

     )

[2] => Array
    (
        [0] => Array
            (
                [clientName] => John Smith
                [clientType] => 0
                [clientDOB] => 1970-01-01
            )

        [1] => Array
            (
                [clientName] => Jeremy White
                [clientType] => 2
                [clientDOB] => 2015-08-19
            )

    )

我使用的代码是这样的:

$finalNames = array_map(function ($item) use (&$namesCount) {
    if (!isset($namesCount[$item['clientName']])) {
        $namesCount[$item['clientName']] = 0;
    }

    $namesCount[$item['clientName']]++;

    $item['clientName'] = $item['clientName'] . ' ' . $namesCount[$item['clientName']];

    return $item;
}, $arrayOfTravellers);

array_map(function($item, $key) use ($namesCount, &$finalNames) {
    $finalNames[$key]['clientName'] = $namesCount[$item['clientName']] == 1
        ? str_replace(' 1', '', $finalNames[$key]['clientName'])
        : $finalNames[$key]['clientName'];
}, $arrayOfNames, array_keys($arrayOfTravellers));

返回一堆错误,例如: 注意:未定义索引:第 330 行 /Applications/MAMP/htdocs/europatours/functions/reportsFunctions.php 中的 clientName

我的假设是代码不适合多维数组。有人可以帮忙吗?我只需要在存在重复名称的情况下保留数组的完整结构,添加一个计数器,例如 John Smith 1, John Smith 2,而 Jeremy White 仍然没有计数器。

【问题讨论】:

  • 你有没有尝试过实现目标?
  • 请阅读how do i ask a good Question,因为您的问题没有任何努力
  • 我只是想知道你为什么要这样做..这些人的名字不是唯一的,也不应该是唯一的..
  • 是的,但我尝试过的逻辑是愚蠢的,代码也很尴尬!哈哈
  • 不要担心乱码,至少我们可以看一看,总比没有代码好

标签: php arrays


【解决方案1】:
$arrayOfNames = array(
    array('clientName' => 'John'),
    array('clientName' => 'John'),
    array('clientName' => 'Mary'),
    array('clientName' => 'Mary'),
    array('clientName' => 'Mary'),
    array('clientName' => 'Tony'),
    array('clientName' => 'Alex')
);

$namesCount = array();

$finalNames = array_map(function ($item) use (&$namesCount) {
    if (!isset($namesCount[$item['clientName']])) {
        $namesCount[$item['clientName']] = 0;
    }

    $namesCount[$item['clientName']]++;

    $item['clientName'] = $item['clientName'] . ' ' . $namesCount[$item['clientName']];

    return $item;
}, $arrayOfNames);

array_map(function($item, $key) use ($namesCount, &$finalNames) {
    $finalNames[$key]['clientName'] = $namesCount[$item['clientName']] == 1
        ? str_replace(' 1', '', $finalNames[$key]['clientName'])
        : $finalNames[$key]['clientName'];
}, $arrayOfNames, array_keys($arrayOfNames));

echo '<pre>';
    var_dump($finalNames);
echo '</pre>';

输出将是:

array(7) {
  [0]=>
  array(1) {
    ["clientName"]=>
    string(6) "John 1"
  }
  [1]=>
  array(1) {
    ["clientName"]=>
    string(6) "John 2"
  }
  [2]=>
  array(1) {
    ["clientName"]=>
    string(6) "Mary 1"
  }
  [3]=>
  array(1) {
    ["clientName"]=>
    string(6) "Mary 2"
  }
  [4]=>
  array(1) {
    ["clientName"]=>
    string(6) "Mary 3"
  }
  [5]=>
  array(1) {
    ["clientName"]=>
    string(4) "Tony"
  }
  [6]=>
  array(1) {
    ["clientName"]=>
    string(4) "Alex"
  }
}

【讨论】:

  • 谢谢...那些名字不重复不应该有计数器。
  • 什么意思?这就是我从问题中所理解的......名称数组有重复......
  • 现在我明白你的意思了。好吧,让我检查一下
  • 看我贴的数组。有不重复的......托尼和亚历克斯。在您的代码中,tony 和 alex 得到 1 而不是没有。只有重复项需要有计数器。
  • 感谢您并为这个混乱的问题道歉,但我不知道如何正确解释自己,尤其是我的垃圾代码。
【解决方案2】:

在添加新值时,array_columnin_array 的组合如何?

$records = array(); // your data
$name = 'John';

$i = 0;
do
{
    $newName = $name . ( ($i == 0)? '' : ' '.$i );
    $i++;
}
while (in_array($newName, array_column($records, 'clientName')));

$records[] = array('clientName' => $newName);

由于性能问题,您可能希望在循环之前只调用一次 array_columns 并将结果存储在一个变量中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 2013-02-22
    • 2018-05-04
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多