【问题标题】:arrays having numeric values separated by a dot具有由点分隔的数值的数组
【发布时间】:2018-02-01 15:20:11
【问题描述】:

假设我有以下 2 个数组

$array_a = array("01.03.04.45.06");

$array_b = array("01.05","07.09.12","01.45","09.11","08.09.32","79.02.03.12","02.03")

$array_a 包含一个由点分隔的 5 个数字的字符串,而 $array_b 包含由点分隔的 2 个最多 5 个数字的各种字符串。

我需要比较 $array_a 和 $array_b 并搜索并返回 TRUE,如果有最小值。数组 $array_a 中数组 $array_b 的任意键的 2 个数字

例如在上面的情况下,比较应该返回 TRUE 因为 $array_b[3] ( 01.45 ) 中的数字在 $array_a 内。

有什么方法可以进行这种比较? 我尝试使用 array_intersect 和 array_diff 但没有成功。

【问题讨论】:

  • $array_a上没有11
  • 抱歉,01.45 更正
  • $array_b[3] 是 01.45 , 01 和 45 在 $array_a 中。
  • 你需要写这个;数组函数不会像那样帮助你,因为你现在拥有的是一个字符串和一个字符串数组。
  • 不知怎的,我对一个面试问题印象深刻。

标签: php arrays compare


【解决方案1】:

你可以使用array_filter匹配数组元素的列表

$array_a = array("01.03.04.45.06");

$array_b = array("01.05","07.09.12","01.45","09.11","08.09.32","79.02.03.12","02.03");

//Make $array_a array
$array_a = explode( ".", $array_a[0] );

$result = array_filter($array_b,function( $var ) use($array_a){
    $temp = explode( ".", $var );
    $count = 0;

    foreach( $temp as $x ) if ( in_array( $x, $array_a ) ) $count++;
    if ( $count >= 2 ) return true;
});


echo "<pre>";
print_r( $result );
echo "</pre>";

这将导致:

Array
(
    [2] => 01.45
)

文档:http://php.net/manual/en/function.array-filter.php


如果你想返回一个bool only,你可以使用array_reduce

$array_a = array("01.03.04.45.06");

$array_b = array("01.05","07.09.12","01.45","09.11","08.09.32","79.02.03.12","02.03");

//Make $array_a array
$array_a = explode( ".", $array_a[0] );

$result = array_reduce($array_b,function( $carry, $var ) use($array_a){
    $temp = explode( ".", $var );
    $count = 0;

    foreach( $temp as $x ) if ( in_array( $x, $array_a ) ) $count++;
    if ( $count >= 2 || $carry ) return true;
});


echo "<pre>";
print_r( $result );
echo "</pre>";

这将返回到true

文档:http://php.net/manual/en/function.array-reduce.php


更新:您可以使用array_values 将关联数组转换为基本/数值数组。

$array_b[]["BA.CA.FI.GE.MI"]="01.08"; 
$array_b[]["BA.GE.MI.NA.RM"]="02.04"; 
$array_b[]["BA.MI.NA.RM.VE"]="01.45";

$array_a = array("01.03.04.45.06");

//Make $array_a array
$array_a = explode( ".", $array_a[0] );

$result = array_filter($array_b,function( $var ) use($array_a){
    $var = array_values($var);
    $temp = explode( ".", $var[0] );
    $count = 0;
    foreach( $temp as $x ) if ( in_array( $x, $array_a ) ) $count++;
    if ( $count >= 2 ) return true;
});

echo "<pre>";
print_r( $result );
echo "</pre>";

这将导致:

Array
(
    [2] => Array
        (
            [BA.MI.NA.RM.VE] => 01.45
        )

)

http://php.net/manual/en/function.array-values.php

【讨论】:

  • 您的第一个解决方案对我来说没问题。但是我有一个问题,我必须按照 $array_b[]["BA.CA.FI.GE.MI"]="01.08"; 更改array_b $array_b[]["BA.GE.MI.NA.RM"]="02.04"; $array_b[]["BA.MI.NA.RM.VE"]="01.45";您能告诉我如何更改您的代码以使用新数组吗?谢谢。
  • @graziano 请检查我的更新答案。请告诉我进展如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多