我正在尝试设置一个脚本,该脚本会将文件从特定目录移动到特定子目录,具体取决于文件名的前缀。
就目前而言,我有两个数组,一个这样设置:
$arr1 = array(
[12] => "prefix1",
[34] => "prefix2"
)
等,其中键是我们数据库中的用户ID,值是该用户的电子邮件地址的前缀。
另一个就像这样:
$arr2 = array(
["prefix1_filename.ext"] => "prefix1",
["prefix2_filename.ext"] => "prefix2"
)
以此类推。
这些数组的长度将不同。
我要做的是比较两个数组,在arr1中的值与arr2中的值匹配的情况下,获取相应的键并将其推入如下所示的新数组中:
$arr3 = array(
[12] => "prefix1_filename.ext",
[34] => "prefix2_filename.ext"
)
然后将其用于将文件移动到以ID命名的子目录-例如/foo/bar/12/prefix1_filename.ext、/foo/bar/34/prefix2_filename.ext等,等等。
我尝试使用array_combine,但是由于两者的长度不相同,因此会导致错误。我也尝试过将它们相交,但无济于事。
有人能指出我要解决的办法吗?如果可以简化操作,我可以翻转数组以使键成为值。
非常感谢。
答案 0 :(得分:0)
注意:$ arr2无法比较,因为数组键不同
<?php
$arr1 = array(12=> "prefix1",34 => "prefix2");
$arr3 = array(12 => "prefix_filename.ext",
34 => "prefix2_filename.ext"
);
$arr2 = array(
"prefix_filename.ext" => "prefix",
"prefix2_filename.ext" => "prefix2"
);
$result=array_intersect($arr1,$arr2);
print_r($result);
?>
答案 1 :(得分:0)
可以做到这一点,但要有一些技巧。
首先,让我们从$ arr1中获取$ arr2中存在的值:
$isect1 = array_intersect($arr1, $arr2);
然后相反。
$isect2 = array_intersect($arr2, $arr1);
现在我们从两个数组中都有键,但是我们想对它们进行排序以确保它们的顺序相同。我们需要先将它们翻转。
$sorted1 = array_sort(array_flip($isect1));
$sorted2 = array_sort(array_flip($isect2));
现在我们有了,我们可以将它们重新组合
$arr3 = array_combine(array_values($sorted1), array_values($sorted2));
演示,为了减少变量复制,我们可以一行完成:
$arr3 = array_combine(array_values(array_sort(array_flip(array_intersect($arr1, $arr2)))), array_values(array_sort(array_flip(array_intersect($arr2, $arr1)))));
Ph。最终到达那里!
编辑
这是我的Psy Shell输出对此进行测试,并在其中添加了一些额外的“不匹配”值以测试过滤:
>>> $arr1 = [12 => "prefix1", 34 => "prefix2", 99 => "some_other_prefix"];
=> [
12 => "prefix1",
34 => "prefix2",
99 => "some_other_prefix",
]
>>> $arr2 = ["prefix1_filename.ext" => "prefix1", "prefix2_filename.ext" => "prefix2", "another_prefix_filename.ext" => "another_prexix"];
=> [
"prefix1_filename.ext" => "prefix1",
"prefix2_filename.ext" => "prefix2",
"another_prefix_filename.ext" => "another_prexix",
]
>>> $arr3 = array_combine(array_values(array_sort(array_flip(array_intersect($arr1, $arr2)))), array_values(array_sort(array_flip(array_intersect($arr2, $arr1)))));
=> [
12 => "prefix1_filename.ext",
34 => "prefix2_filename.ext",
]