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

时间:2016-02-26 22:56:24

标签: php arrays

我可能[超级]过度思考这个问题。我试图用[1,9],[4,6] [5,5],[6,4],[9,1]和重复数字(我有一个超级大脑)的值来分析一个数组放屁甚至不记得像这样的数字的术语)删除(最后两个),以便只打印[1,9],[4,6] [5,5]。

我在考虑将这个数组变成一个字符串并使用preg_match,但我很确定即使我有正确的正则表达式,这也行不通。

6 个答案:

答案 0 :(得分:3)

如果您有一对像这样的对:

$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); }

答案 1 :(得分:1)

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

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

$array = array_pop($array);

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

答案 2 :(得分:1)

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

我们可以将数组切成两半,只得到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
    )
)

Demo at Codepad

如果数组中有偶数项,则使用

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
    )
)

答案 3 :(得分:1)

我就是这样做的(我希望不要过分思考这个:))

$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
)

答案 4 :(得分:1)

你建议的结果是[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]);
}

答案 5 :(得分:0)

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

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

<?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);