【问题标题】:array_search returns incorrect positionarray_search 返回不正确的位置
【发布时间】:2016-05-20 08:23:29
【问题描述】:

通过搜索社区和谷歌,我只能看到 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 ,它与位置 ..['end'][0] 匹配,因此我期望返回的 $pos 也是 0,但返回的 $pos 是 1 并且错误的元素被处理。

问题详解 $data 数组是动态的,并不总是这样。尽管可以在位置 0 清楚地找到 "end" 数组中匹配的 $s​​tart_time 值,但返回的 $pos 值却是 1。

已经为此苦苦挣扎了很长一段时间,无法找到错误,希望其他人会。

最好的,

阿拉里

【问题讨论】:

  • 你能输入想要的输出吗?
  • @Frayne Konok:它应该做的是检查 $start_time 是否可以在 $area['end'] 数组中找到,如果没有,则什么也不做,但如果找到它, 将返回的键作为 $pos 变量在里面进行处理。但是由于 array_search 可以为找到的键返回 0 位置,所以我必须在它不为假时进行严格比较(当什么都没有找到时,array_search 返回值。
  • @Kr Bm:将尽快将所需的输出作为编辑
  • 出于兴趣,您为什么使用&$area&$start_time 作为引用而不是简单的值?
  • 我不明白,我做错了什么,为什么所有的反对票?我已经清楚地完成了我的研究并提供了样本数据..

标签: php arrays search


【解决方案1】:

这是由于运算符优先级而发生的。 !== 优先于 =。因此,在您的 if 语句中,$pos 被有效地分配了array_search($start_time, $area['end'], true) !== false 的结果,即 1。 只需将您的 if 语句更改为此,它应该可以工作

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

【讨论】:

  • 非常感谢!像魅力一样工作,解释得很好!我一定是放错了括号,因为这就是我想要的,而我这辈子都想不通。再次感谢您!
【解决方案2】:

这应该可行:

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;
            }
        }
    }

【讨论】:

  • 我不能设置 $area['end'][0] 但必须设置 $area['end'][$pos] 元素,因为它可能不是0,它必须是在“end”数组中找到 $start_time 值的位置,在这种情况下返回 1 而不是键 0,它实际上是。
【解决方案3】:

你应该试试这个代码,它很简单,适合你的情况

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]); 
        }
    }

【讨论】:

  • $data 数组是动态的,我必须设置找到 $start_time 的位置的元素,在这个数组的情况下是 0,但由于某种原因返回的值是 0
  • 那么你应该使用更多$data的位置,这样我才能更好地理解
  • 例如所有的 0 和 1 位置值都可以翻转
  • 那么你可以在if条件之前使用ksort()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
相关资源
最近更新 更多