我需要在数组中以数字组合搜索和打印所有匹配输入数字。
我的数组看起来像这样:
$ar = ['01-05-24-30-35-36', '25-27-32-34-37-42', '11-17-18-22-33-41'];
以下是输入和逻辑:
鉴于A: 01-05-24-30-35-36 (是的,因为它匹配数组[0]上的确切组合数字)
鉴于B: 05-30-01-36-35-24 (是的,因为给定的6个数字都存在于数组[0],不同的数字位置)
鉴于C: 01-05-24-30-35-33 (错误,因为给定的6个数字不存在于数组中的一个数字组合中,即使第一个存在5个数字,但最后一个(33)不存在,那么它将变为假)
提前感谢您的帮助。
答案 0 :(得分:1)
这是@ Sammitch的优秀建议的实现:
<?php
$ar = ['01-05-24-30-35-36', '25-27-32-34-37-42', '11-17-18-22-33-41'];
function doesItMatch($arg1) {
global $ar;
$in = $arg1;
$inA = explode("-", $in);
sort($inA);
$inB = implode("-", $inA);
foreach ($ar as $elem) {
if ($elem == $inB) {
echo("found match for $arg1 : $elem\n");
return;
}
}
echo("found NO match for $arg1 !!!\n");
}
doesItMatch("01-05-24-30-35-36");
doesItMatch("05-30-01-36-35-24");
doesItMatch("01-05-24-30-35-33");
?>
输出:
found match for 01-05-24-30-35-36 : 01-05-24-30-35-36
found match for 05-30-01-36-35-24 : 01-05-24-30-35-36
found NO match for 01-05-24-30-35-33 !!!
根据需要调整您的整体代码。
答案 1 :(得分:1)
我只是添加它,因为它是我已经拥有的代码,它可以满足您的需求。我认为它比其他答案更具通用性。
这可以查找:
它返回一个数组,其中你的针作为键,而真或假的值取决于它是否已找到。
如果除了破折号之外还需要别的东西,可以添加第三个参数来更改分隔符。
<?php
$ar = ['01-05-24-30-35-36', '25-27-32-34-37-42', '11-17-18-22-33-41'];
$ar2 = ['01-05-24-30-35-36', '05-30-01-36-35-24', '01-05-24-30-35-33'];
var_dump(sortAndMatch($ar2, $ar));
/*
* array (size=3)
* '01-05-24-30-35-36' => boolean true
* '05-30-01-36-35-24' => boolean true
* '01-05-24-30-35-33' => boolean false
*/
/*
* Sort 2 strings or arrays of strings and try to find $needles into $haystack.
* Returns array($needle => bool);
* $array[$needle] is true when it's found.
* $array[$needle] is false when it isn't.
*/
function sortAndMatch($needles, $haystack, $delimiter = '-'){
//Sort haystack
foreach ((array)$haystack as $k => $combination){
$haystack[$k] = explode($delimiter, $combination);
sort($haystack[$k]);
}
//Sort and compare needles, builds $results
foreach((array)$needles as $k => $needle){
$needle= explode($delimiter, $needle);
sort($needle);
$results[$needles[$k]] = false;
if(array_search($needle, $haystack) !== false){
$results[$needles[$k]] = true;
}
}
return $results;
}
答案 2 :(得分:0)
您的 haystack 数字集已经排序,因此可以保持不变。
在检查 haystack 字符串之前,您只需要爆炸,排序和重新加载 needle 号码(这是in_array()
的用途)。< / p>
代码:(Demo)
function isMatch($haystack, $needle) {
$nums = explode('-', $needle); // explode
sort($nums); // sort
$needle = implode('-', $nums); // implode
return in_array($needle, $haystack); // assess
}
$matches = ['01-05-24-30-35-36', '25-27-32-34-37-42', '11-17-18-22-33-41']; // already sorted
$givens = ['01-05-24-30-35-36', '05-30-01-36-35-24', '01-05-24-30-35-33'];
foreach ($givens as $given) {
echo "$given : " , (isMatch($matches, $given) ? 'true' : 'false') , "\n";
}
输出:
01-05-24-30-35-36 : true
05-30-01-36-35-24 : true
01-05-24-30-35-33 : false