通过搜索社区和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
答案 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]);
}
}