on http://php.net/manual/en/function.in-array.php -如果向下滚动,它会给出一个函数来确定字符串是否在多维数组的查询中。如果你发现自己需要一个多维数组in_array之类的函数,你可以使用下面的函数。在相当长的时间内工作"
这是原始代码(工作):
function in_multiarray($elem, $array)
{
$top = sizeof($array) - 1;
$bottom = 0;
while($bottom <= $top)
{
if($array[$bottom] == $elem)
return true;
else
if(is_array($array[$bottom]))
if(in_multiarray($elem, ($array[$bottom])))
return true;
$bottom++;
}
return false;
}
我想做的是,而不是返回"真"或"假"-我想返回行#。所以我最初的想法是简单地将"return true"替换为"return $bottom";但是,它没有返回记录号。
修改后的函数(不工作);
function in_multiarray($elem, $array)
{
$top = sizeof($array) - 1;
$bottom = 0;
while($bottom <= $top)
{
if($array[$bottom] == $elem)
return $bottom;
else
if(is_array($array[$bottom]))
if(in_multiarray($elem, ($array[$bottom])))
return $bottom;
$bottom++;
}
return false;
}
是否有人知道如何修改此函数以返回包含匹配的行数?
下面是一个数组的示例…
$sample = array
array ("oldpage1.php","newpage1.php"),
array ("oldpage2.php","newpage2.php"),
array ("oldpage3.php","newpage3.php"),
array ("oldpage4.php","newpage4.php"),
array ("oldpage5.php","newpage5.php")
etc.
);
$row = in_multiarray($input, $sample);
因此,如果我们知道行号,我们可以用一个简单的$newpage=$sample[$row][1]
谢谢!
值得注意的是,像in_array
这样的函数旨在告诉您值是否存在于数组中。您正在寻找的似乎更接近于array_search
之类的东西,CC_3旨在实际为您提供指向数组中给定值的键。
然而,因为您使用的是多维数组,所以您实际查找的是指向包含该值的数组的键。因此,我们可以用两个简单的步骤来解决这个问题。
- <
- 过滤器/gh>
in_array
映射到第一个数组中的每个元素(只是另一个数组)。这将告诉我们主数组的哪些元素包含了包含我们正在搜索的值的数组。
$result = array_map(function($arr) use($search) {
return in_array($search, $arr, true);
}, $arr, [$searchValue]);
第二步是将键返回给这些数组(即。筛选结果)。
$keys = array_keys(array_filter($result));
现在您有任何匹配项的所有键。如果你想只应用一个自定义过滤器来指定子数组中要查找的位置,你也可以这样做。
$search = "oldpage2.php";
$sample = [
["oldpage1.php","newpage1.php"],
["oldpage2.php","newpage2.php"],
["oldpage3.php","newpage3.php"],
["oldpage4.php","newpage4.php"],
["oldpage5.php","newpage5.php"],
];
$keys = array_keys(array_filter($sample, function($arr) use($search) {
return $arr[0] === $search;
}));
var_dump($keys);
你得到…
<>之前数组(1){[0] =>int (1)}>之前现在你知道了"oldpage2。是在$sample[1][0]
的第一行,这意味着你可以这样做,以获得数组的结果。
foreach($keys as $key) {
echo "{$sample[$key][0]} maps to {$sample[$key][1]}n";
}
给你<>之前Oldpage2.php映射到newpage2.php>之前
如果您想只返回第一个结果,您也可以使用类似的方法使用类似的函数。
function getFirstMatch($search, Array $arr) {
foreach($arr as $key => $value) {
if ($value[0] === $search) {
return $value[1];
}
}
}
echo getFirstMatch("oldpage4.php", $sample); // newpage4.php
更好的选择
当然,更好的方法是实际使用oldpage名称作为数组的实际键,而不是通过数组进行这种昂贵的搜索,因为PHP中按键查找数组只是O(1)
操作,而这种针/干堆方法是O(N)
。
所以我们把你的$samples
数组变成这样的东西,搜索不再需要任何函数…
$samples = [
"oldpage1.php" => "newpage1.php",
"oldpage2.php" => "newpage2.php",
"oldpage3.php" => "newpage3.php",
"oldpage4.php" => "newpage4.php",
"oldpage5.php" => "newpage5.php",
];
现在你可以做一些像$newpage = $samples[$search]
这样的事情,你就得到了你想要的东西。因此,echo $samples["oldpage2.php"]
直接给出了"newpage2.php"
,而不需要在每个数组中搜索。
您可以使用以下代码获取值的完整路径:
function in_multiarray($elem, $array, &$result)
{
$top = sizeof($array) - 1;
$bottom = 0;
while($bottom <= $top)
{
if($array[$bottom] == $elem) {
array_unshift($result, $bottom);
return true;
}
else {
if(is_array($array[$bottom])) {
if(in_multiarray($elem, $array[$bottom], $result)) {
array_unshift($result, $bottom);
return true;
}
}
}
$bottom++;
}
array_shift($result);
return false;
}
$sample = array(
array ("oldpage1.php","newpage1.php"),
array ("oldpage2.php","newpage2.php"),
array ("oldpage3.php","newpage3.php"),
array ("oldpage4.php","newpage4.php"),
array ("oldpage5.php","newpage5.php")
);
$input = "newpage5.php";
$result = [];
in_multiarray($input, $sample, $result);
print_r($result);