比较数组直到我有一个唯一的数组
Comparing arrays until I have a unique array
我有以下名为 $existing_combinations
的多维数组
Array
(
[0] => Array
(
[1] => 6
[2] => 7
[3] => 9
)
[1] => Array
(
[1] => 1
[2] => 21
[3] => 9
)
[2] => Array
(
[1] => 1
[2] => 7
[3] => 9
)
)
然后我生成一个新数组 ($new_combination
),它具有同一组值的组合。示例:
Array
(
[1] => 6
[2] => 21
[3] => 9
)
然后我使用以下代码测试 $new_combination
是否存在于 $existing_combinations
中,希望我能以 $new_combination
中的唯一组合结束:
foreach($existing_combinations as $key => $combination){
while($new_combination == $combination){
$new_combination = generateNewCombination();
}
}
问题是,如果 $new_combination
匹配一个不在索引 0 处的数组,那么当我生成一个新组合时,我就有可能匹配一个已经过测试的 $combination
反对(并且不会再次测试)。
很抱歉,如果这是一个简单的问题,但我正在努力思考如何确保 $new_combination
最终始终是独一无二的。
有什么想法吗?
谢谢
合并所有二级数组,运行array_unique()去除重复值
在这种情况下可以使用in_array,因为php将数组作为值进行比较。所以,代码可以是:
while(in_array($new_combination = generateNewCombination(), $existing_combinations));
print_r($new_combination);
我写了下面的才意识到 in_array
也可以查看数组是否存在于数组中。所以你可以简单地这样做:
if (!in_array($new_combination, $existing_combinations)) {
// It's unique.
}
在下面的过时位中,请参阅有关使用 sort
的说明,如果相同数字的不同序列对于您的目的而言不被认为是唯一的。
[娱乐]
可能不是最优雅的方式,但为了简单起见,我会这样做:
$combo_hashes = [];
// Implode the existing combos into strings.
foreach($existing as $vals) {
$combo_hashes[] = implode(':', $vals);
}
那么,您需要检查的新组合是:
// Check if the "hash"-string already exists.
if (!in_array( implode(':', $new_combo), $combo_hashes)) {
// ... and we're unique.
}
这假设您认为 [1,3,2]
不同于 [2,1,3]
。如果它们是等效的(我不知道你的用例是什么),你应该在生成检查字符串之前 sort($vals);
。
我有以下名为 $existing_combinations
Array
(
[0] => Array
(
[1] => 6
[2] => 7
[3] => 9
)
[1] => Array
(
[1] => 1
[2] => 21
[3] => 9
)
[2] => Array
(
[1] => 1
[2] => 7
[3] => 9
)
)
然后我生成一个新数组 ($new_combination
),它具有同一组值的组合。示例:
Array
(
[1] => 6
[2] => 21
[3] => 9
)
然后我使用以下代码测试 $new_combination
是否存在于 $existing_combinations
中,希望我能以 $new_combination
中的唯一组合结束:
foreach($existing_combinations as $key => $combination){
while($new_combination == $combination){
$new_combination = generateNewCombination();
}
}
问题是,如果 $new_combination
匹配一个不在索引 0 处的数组,那么当我生成一个新组合时,我就有可能匹配一个已经过测试的 $combination
反对(并且不会再次测试)。
很抱歉,如果这是一个简单的问题,但我正在努力思考如何确保 $new_combination
最终始终是独一无二的。
有什么想法吗?
谢谢
合并所有二级数组,运行array_unique()去除重复值
在这种情况下可以使用in_array,因为php将数组作为值进行比较。所以,代码可以是:
while(in_array($new_combination = generateNewCombination(), $existing_combinations));
print_r($new_combination);
我写了下面的才意识到 in_array
也可以查看数组是否存在于数组中。所以你可以简单地这样做:
if (!in_array($new_combination, $existing_combinations)) {
// It's unique.
}
在下面的过时位中,请参阅有关使用 sort
的说明,如果相同数字的不同序列对于您的目的而言不被认为是唯一的。
[娱乐]
可能不是最优雅的方式,但为了简单起见,我会这样做:
$combo_hashes = [];
// Implode the existing combos into strings.
foreach($existing as $vals) {
$combo_hashes[] = implode(':', $vals);
}
那么,您需要检查的新组合是:
// Check if the "hash"-string already exists.
if (!in_array( implode(':', $new_combo), $combo_hashes)) {
// ... and we're unique.
}
这假设您认为 [1,3,2]
不同于 [2,1,3]
。如果它们是等效的(我不知道你的用例是什么),你应该在生成检查字符串之前 sort($vals);
。