我可能[超级]想多了。我正在尝试分析一个具有 [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);