PHP:从数组中取出重复的数字,然后打印出来


PHP: take out duplicate digits from an array then print them out

我可能[超级]想多了。我正在尝试分析一个具有 [1,9]、[4,6] [5,5]、[6,4]、[9,1] 和重复数字等值的数组(我有一个超级脑屁,甚至不记得像这样的数字的术语)删除(最后两个),以便只打印 [1,9]、[4,6] [5,5]。

我在想把这个数组变成一个字符串并使用preg_match,但我很确定即使我有正确的正则表达式,这也不会起作用。

如果你有一个这样的对数组:

$x = array(
    array(1,9),
    array(4,6),
    array(5,5),
    array(6,4),
    array(9,1)
);

以下是获取唯一对的一种方法:

foreach ($x as $pair) {
    sort($pair);
    $unique_pairs[implode(',', $pair)] = $pair;
}

这使用每个排序对的字符串表示形式作为新数组中的键,因此根据定义,结果将具有不同的值。

至于打印出问题的一部分,一旦您拥有唯一值,您就可以循环访问它们并以您喜欢的任何格式打印出来,例如:

foreach ($unique_pairs as $pair) { vprintf("[%d,%d]<br>", $pair); }

看起来元素是对称分布的。

我们可以将数组切成两半,只得到前半部分,array_slice()

$array = array(
    array(1,9),
    array(4,6),
    array(5,5),
    array(6,4),
    array(9,1),
);
print_r(array_slice($array, 0, ceil(count($array) / 2)));

结果:

Array(
    [0] => Array(
        [0] => 1
        [1] => 9
    )
    [1] => Array(
        [0] => 4
        [1] => 6
    )
    [2] => Array(
        [0] => 5
        [1] => 5
    )
)

在代码键盘上演示。

ceil()用于在数组中有偶数个项目时将数字向上舍入到下一个最高整数。示例:如果数组中有 3 个项目,5 / 2将返回 2.5 ,我们想要 3 个项目,所以我们使用 ceil(2.5) 给出3

包含 3 项的示例:

$array = array(
    array(1,9),
    array(5,5),
    array(9,1),
);
print_r(array_slice($array, 0, ceil(count($array) / 2)));

结果:

Array(
    [0] => Array(
        [0] => 1
        [1] => 9
    )
    [1] => Array(
        [0] => 5
        [1] => 5
    )
)

包含 4 项的示例:

$array = array(
    array(1,9),
    array(7,7),
    array(7,7),
    array(9,1),
);
print_r(array_slice($array, 0, ceil(count($array) / 2)));

结果:

Array(
    [0] => Array(
        [0] => 1
        [1] => 9
    )
    [1] => Array(
        [0] => 7
        [1] => 7
    )
)

如果我正确理解您要做什么,您想从数组中删除最后 2 个元素吗?

PHP 中有一个名为 array_pop 的函数,它从数组中删除最后一个元素。

$array = array_pop($array);

因此,如果您运行两次,您将从数组中删除最后 2 个元素。

这就是

我的做法(我希望我没有过度思考这个:))

$stringArray = array();
$stringArray[] = '1,9';
$stringArray[] = '4,6';
$stringArray[] = '5,5';
$stringArray[] = '6,4';
$stringArray[] = '9,1';
foreach($stringArray as &$numString) {
    $numString = explode(',', $numString);
    usort($numString, function($a, $b) {return $a - $b;});
    $numString = implode(',', $numString);
}

$a = array_unique($a);
print_r($a);

你基本上把每个元素分解成一个子数组,对它进行排序,然后把它内爆回来。调用 array_unique 后,数组中将留下唯一值。

输出将是

Array
(
    [0] => 1,9
    [1] => 4,6
    [2] => 5,5
)

您建议的结果将 [a,b] 视为等效于 [b,a],这使得问题变得更加复杂。下面的代码给出了您要求的结果,但没有真正了解您尝试解决的问题是什么以及 [1,9] 是否等同于解决方案中的 [9,1]:

$a=array(array(1,9),array(4,6),...
$dup=array();
for ($i=0; $i<count($a) -1; $i++) {
   for ($j=$i+1; $j<count($a); $j++) {
      if (($a[$i][0]==$a[$j[0] && $a[$i][1]==$a[$j[1])
         || ($a[$i][0]==$a[$j[1] && $a[$i][1]==$a[$j[0])) {
            $dup[]=$j;
      }
   }
}
foreach ($dup as $i) {
    unset($a[$i]);
}

所以我实际上会假设你的问题与其他人有不同的含义。我相信你问的是:

如何过滤掉已使用项目反向的数组项目?

<?php
// The example set you gave
$numberSets = [[1, 9], [4, 6], [5, 5], [6, 4], [9, 1]];
// Initialize an empty array to keep track of what we've seen
$keys = [];
// We use array filter to get rid of items we don't want
// (Notice that we use & on $keys, so that we can update the variable in the global scope)
$numberSets = array_filter($numberSets, function($set) use(&$keys) {
    // Reverse the array
    $set = array_reverse($set);
    // Create a string of the items
    $key = implode('', $set);
    // Get the reverse of the numbers
    $reversedKey = strrev($key);
    // If the palindrome of our string was used, return false to filter
    if (isset($keys[$reversedKey])) {
        return false;
    }
    // Set the key so it's not used again
    // Since $keys is being passed by reference it is updated in global scope
    $keys[$key] = true;
    // Return true to NOT filter this item, since it or it's reverse were not matched
    return true;
});
var_dump($numberSets);
相关文章: