比较2个数组的值,然后使用匹配值的键移动文件

时间:2019-03-25 02:23:09

标签: php arrays

我正在尝试设置一个脚本,该脚本会将文件从特定目录移动到特定子目录,具体取决于文件名的前缀。

就目前而言,我有两个数组,一个这样设置:

$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,但是由于两者的长度不相同,因此会导致错误。我也尝试过将它们相交,但无济于事。

有人能指出我要解决的办法吗?如果可以简化操作,我可以翻转数组以使键成为值。

非常感谢。

2 个答案:

答案 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",
   ]