我可能[超级]过度思考这个问题。我试图用[1,9],[4,6] [5,5],[6,4],[9,1]和重复数字(我有一个超级大脑)的值来分析一个数组放屁甚至不记得像这样的数字的术语)删除(最后两个),以便只打印[1,9],[4,6] [5,5]。
我在考虑将这个数组变成一个字符串并使用preg_match,但我很确定即使我有正确的正则表达式,这也行不通。
答案 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
)
)
如果数组中有偶数项,则使用 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);