2016-05-20 4 views
0

Просматривая сообщество и Google, я могу видеть проблемы с array_search потерять поиск, итоговое целое число 0, равное строке.array_search возвращает неправильную позицию

Однако в моем случае theres no zero и строгий поиск по-прежнему не помогают.

Массив:

$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 массив динамический и не всегда будет таким. Несмотря на то, что совпадающее значение $ start_time в массиве «end» может быть явно найдено в позиции 0, возвращается значение $ pos. 1.

Были проблемы с этим в течение довольно долгого времени, и я не могу найти ошибку , надеюсь, что кто-то еще это сделает.

Бест,

Alari

+0

вы можете ввести желаемый результат? – David

+0

@Frayne Konok: Что нужно сделать, это проверить, можно ли $ start_time найти в массиве $ area ['end'], если нет, то ничего не делать, но если он его найдет, верните ключ в качестве $ pos для обработки внутри. но поскольку array_search может вернуть 0 позиций для найденного ключа, я должен выполнить строгое сравнение, когда оно не является ложным (whish - это значение возвращаемого значения array_search, когда ничего не найдено. –

+0

@Kr Bm: сделает желаемый результат как редактирование asap –

ответ

2

Это происходит из-за приоритета оператора. ! == имеет больше приоритета над =. Таким образом, в вашем случае заявление $pos эффективно получать присваивается результат array_search($start_time, $area['end'], true) !== false, который 1. Просто измените ваш, если заявление на это, и он должен работать

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

Большое спасибо! Работает как шарм и очень хорошо объясняется! Должно быть, я упустил скобки, так как это то, что я собирался, и для меня жизнь не могла понять. Еще раз спасибо! –

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

Я не могу установить $ area ['end'] [0], но должен установить элемент $ area ['end'] [$ pos], потому что он может не быть 0, это должно быть местоположение, в котором значение $ start_time было найдено в массиве «end», который в этом случае возвращает 1 вместо ключа 0, где он на самом деле. –

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

массив $ data является динамическим, и я должен установить элемент, в котором было найдено $ start_time, которое в этом случае массива равно 0, но значение, возвращаемое по какой-либо причине, равно 0 –

+0

, тогда вы должны использовать больше позиций '$ data' поэтому я могу понять лучше – David

+0

, например, все значения позиции 0 и 1 могут быть перевернуты –