array_search返回错误的位置

时间:2016-05-20 08:23:29

标签: php arrays search

通过搜索社区和Googleing,我只能看到array_search松散搜索的问题,导致整数0等于字符串。

然而在我的情况下,没有零和严格的搜索似乎仍然没有帮助。

阵列:

$data= array(
            "13" => array(
                "start" => array(
                    0 => "36000",
                    1 => "43200",
                ),
                "end" => array(
                    0 => "43200",
                    1 => "50400",
                ),
            ),
            "14" => array(
                "start" => array(
                    0 => "36000",
                    1 => "43200",
                ),
                "end" => array(
                    0 => "43200",
                    1 => "50400",
                ),
            ),
        );

功能:

foreach ($data as &$area) {
            foreach ($area['start'] as $key => &$start_time) {
                if (($pos = array_search($start_time, $area['end'], true) !== false)) {
                    $area['end'][$pos] = $area['end'][$key];
                    unset($area['start'][$key]);
                    unset($area['end'][$key]);
                }
            }
        }

期望的输出:

$data= array(
            "13" => array(
                "start" => array(
                    0 => "36000",
                ),
                "end" => array(
                    0 => "50400",
                ),
            ),
            "14" => array(
                "start" => array(
                    0 => "36000",
                ),
                "end" => array(
                    0 => "50400",
                ),
            ),
        );

我得到了什么:

$data= array(
            "13" => array(
                "start" => array(
                    0 => "36000",
                ),
                "end" => array(
                    0 => "43200",
                ),
            ),
            "14" => array(
                "start" => array(
                    0 => "36000",
                ),
                "end" => array(
                    0 => "43200",
                ),
            ),
        );

我打算用上述功能实现的目的是结合连续的时隙,可以看出,最后的第一个匹配开始时间是$ data [13] [' start'] [1] = 43200,与位置匹配.. ['结束'] [0],因此我期望返回的$ pos也为0,但返回的$ pos是1,错误的元素得到处理。

详细问题 $ data数组是动态的,并不总是如此。即使匹配的$ start_time值在" end"数组可以清楚地在位置0找到,返回的$ pos值是1。

现在已经挣扎了很长一段时间而且找不到错,希望别人会这样做。

最佳,

Alari

3 个答案:

答案 0 :(得分:2)

由于运营商优先权,这种情况正在发生。 !==优先于=。因此,在if语句中$pos实际上被赋予了array_search($start_time, $area['end'], true) !== false的结果,即1。 只需将你的if语句改为this就可以了。

if (($pos = array_search($start_time, $area['end'], true)) !== false) {

答案 1 :(得分:0)

这应该有效:

<强> PHP

    foreach ($data as &$area) {
        foreach ($area['start'] as $key => &$start_time) {
            if (($pos = array_search($start_time, $area['end'], true) !== false)) {
                $val = $area['end'][$key];
                unset($area['start'][$key]);
                unset($area['end'][$key]);
                $area['end'][0] = $val;
            }
        }
    }

答案 2 :(得分:0)

您应该尝试使用此代码,它很简单并适用于您的情况

foreach ( $data as &$item ){
        ksort($item['start']);
        ksort($item['end']);
        if ( $item['start'][1] == $item['end'][0] ){
            $item['end'][0] = $item['end'][1]; 
            unset($item['end'][1]); 
            unset($item['start'][1]); 
        }
    }