【问题标题】:PHP Compare specific characters betwen two arraysPHP比较两个数组之间的特定字符
【发布时间】:2014-08-27 02:36:38
【问题描述】:

在 PHP 中,我有这样的数组:

Array
(
    [0] => 09:26-DOWN
    [1] => 09:26-UP
    [2] => 09:26-UP
    [3] => 09:26-UP
    [4] => 09:26-UP
    [5] => 09:26-UP
    [6] => 09:26-UP
    [7] => 09:26-UP
    [8] => 09:26-DOWN
    [9] => 09:26-UP
    [10] => 09:26-UP
    [11] => 09:26-UP
    [12] => 09:26-UP
    [13] => 09:26-UP
    [14] => 09:26-UP
    [15] => 09:26-UP
    [16] => 09:26-UP
    [17] => 09:26-UP
)

我想将它与下面的数组进行比较,仅与最后一个字符(UP 和 DOWN)进行比较:

Array
(
    [0] => 09:31-DOWN
    [1] => 09:31-UP
    [2] => 09:31-UP
    [3] => 09:31-UP
    [4] => 09:31-UP
    [5] => 09:31-UP
    [6] => 09:31-UP
    [7] => 09:31-UP
    [8] => 09:31-UP
    [9] => 09:31-UP
    [10] => 09:31-UP
    [11] => 09:31-UP
    [12] => 09:31-UP
    [13] => 09:31-UP
    [14] => 09:31-UP
    [15] => 09:31-UP
    [16] => 09:31-UP
    [17] => 09:31-UP
)

所以目的是检查它在特定时间之间是上升还是下降。

【问题讨论】:

  • 那么最后会发生什么?
  • @MarkM 我想比较数组。假设只比较数组的最后一个字符。
  • $array1[0] 为 'UP' 而 $array2[0] 为 'DOWN' 时,你会期待什么? UP 到 DOWN = DOWN,UP 到 UP = 没有变化,DOWN 到 UP = UP,DOWN 到 DOWN = 没有变化?
  • @Ghost 如果值不同,我想将值发送到电子邮件。如果值相同,则什么也不做。
  • @PrabowoMurti 是的,看起来你有我的问题。但很难解释:'(

标签: php arrays compare character specifications


【解决方案1】:

不完全确定您要做什么,但这里有一个简单的选项。假设每个元素的格式总是相同的,即HH:II-[UP or DOWN],你可以这样做:

$result = array();
foreach ($arr1 as $k=>$v) {
    $result[] = $v[6] . $arr2[$k][6];
}

鉴于您的两个数组,$arr1$arr2,这将产生第三个数组,如:

Array
(
    [0] => DD
    [1] => UU
    [2] => UU
    [3] => UU
    [4] => UU
    ....
)

然后您可以使用此数组的值UUDDUDDU 来确定每个位置的内容。例如键 3 将有 UU,所以你知道它是 UP,UP....

See demo


更新这是使用array_map()的单行版本:

$result = array_map(function($a, $b){return $a[6] . $b[6];}, $arr1, $arr2);

See demo 2

【讨论】:

  • +1 用于更少的字符串处理函数调用。通常比我的回答要快。
  • @MarkM 感谢您的快速回答,我现在可以工作了 :)
  • @bluewolf 很高兴为您提供帮助! PS 请参阅我最近对单行解决方案的更新;)
【解决方案2】:

尝试使用strstr() + trim() 分割状态/状态。

$changed = []; // to store changed statuses

foreach($old as $i => $value){
    $from = trim(strstr($value, '-'), '-');   // getting status (UP / DOWN) from first array
    $to   = trim(strstr($new[$i], '-'), '-'); // getting status (UP / DOWN) from second array

    if($from != $to){ // if statuses are different
        $changed[$i] = [
            'from' => $from,
            'to'   => $to
        ]; // add to changed array
    }
}

完整示例:

<?php
header('Content-Type: text/plain; charset=utf-8');

$old = [
    '09:26-DOWN',
    '09:26-UP',
    '09:26-UP',
    '09:26-UP',
    '09:26-UP',
    '09:26-UP',
    '09:26-UP',
    '09:26-UP',
    '09:26-DOWN',
    '09:26-UP',
    '09:26-UP',
    '09:26-UP',
    '09:26-UP',
    '09:26-UP',
    '09:26-UP',
    '09:26-UP',
    '09:26-UP',
    '09:26-UP'
];

$new = [
    '09:31-DOWN',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP',
    '09:31-UP'
];

$changed = [];

foreach($old as $i => $value){
    $from = trim(strstr($value, '-'), '-');
    $to   = trim(strstr($new[$i], '-'), '-');

    if($from != $to){
        $changed[$i] = [
            'from' => $from,
            'to'   => $to
        ];
    }
}

print_r($changed);
?>

输出:

Array
(
    [8] => Array
        (
            [from] => DOWN
            [to] => UP
        )

)

【讨论】:

  • @bluewolf 祝你工作顺利。干杯。
【解决方案3】:

给出两个数组

<?php 

$array1 = array('UP', 'DOWN', 'UP', 'DOWN');
$array2 = array('UP', 'DOWN', 'DOWN', 'UP');

foreach ($array2 as $key => $new_value)
{
    $old_value = $array1[$key];
    $new_array[$key] = ($old_value <= $new_value ? (($old_value < $new_value) ? 'UP' : 'NO CHANGE') : 'DOWN');
}

var_dump($new_array);

会输出这样的东西

array(4) {
  [0]=>
  string(9) "NO CHANGE"
  [1]=>
  string(9) "NO CHANGE"
  [2]=>
  string(4) "DOWN"
  [3]=>
  string(2) "UP"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多