2017-01-10 5 views
-1

У меня есть вложенный цикл, как этотВложенные циклы одни и те же данные с Еогеасп работают только первые данные для первого цикла

foreach ($subdistricts as $subdistrict) { 
    $originId = $subdistrict->id; 
    $exist[] = $originId; 
    foreach($subdistricts as $subdistrict) { 
     if(($originId != $subdistrict->id) || (!in_array($subdistrict->id,$exist))) { 
      $destinationId = $subdistrict->id; 
      echo 'from: '.$originId.' to: ' .$destinationId; 
     } 
    } 
} 

скажем, у меня есть идентификатор данных, как это = 244.255.266

Я хочу, чтобы результаты будут как:

от '244' до '255'

от '244' до '266'

от '255' до '266'

вместо этого, я получил только:

от '244' до '255'

от '244' до '266'

в $ подпровинциям:

Cake\ORM\Query Object 
(
    [(help)] => This is a Query object, to get the results execute or iterate it. 
    [sql] => SELECT Subdistricts.id AS `Subdistricts__id`, Subdistricts.name AS `Subdistricts__name`, Subdistricts.city_id AS `Subdistricts__city_id` FROM subdistricts Subdistricts WHERE Subdistricts.city_id = :c0 
    [params] => Array 
     (
      [:c0] => Array 
       (
        [value] => 17 
        [type] => integer 
        [placeholder] => c0 
       ) 

     ) 

    [defaultTypes] => Array 
     (
      [Subdistricts__id] => integer 
      [Subdistricts.id] => integer 
      [id] => integer 
      [Subdistricts__name] => string 
      [Subdistricts.name] => string 
      [name] => string 
      [Subdistricts__city_id] => integer 
      [Subdistricts.city_id] => integer 
      [city_id] => integer 
     ) 

    [decorators] => 1 
    [executed] => 1 
    [hydrate] => 1 
    [buffered] => 1 
    [formatters] => 0 
    [mapReducers] => 0 
    [contain] => Array 
     (
     ) 

    [matching] => Array 
     (
     ) 

    [extraOptions] => Array 
     (
     ) 

    [repository] => App\Model\Table\SubdistrictsTable Object 
     (
      [registryAlias] => Subdistricts 
      [table] => subdistricts 
      [alias] => Subdistricts 
      [entityClass] => App\Model\Entity\Subdistrict 
      [associations] => Array 
       (
        [0] => cities 
       ) 

      [behaviors] => Array 
       (
       ) 

      [defaultConnection] => default 
      [connectionName] => default 
     ) 

) 

за $ подрайона:

App\Model\Entity\Subdistrict Object 
(
    [id] => 258 
    [name] => Abiansemal 
    [city_id] => 17 
    [[new]] => 
    [[accessible]] => Array 
     (
      [*] => 1 
     ) 

    [[dirty]] => Array 
     (
     ) 

    [[original]] => Array 
     (
     ) 

    [[virtual]] => Array 
     (
     ) 

    [[errors]] => Array 
     (
     ) 

    [[invalid]] => Array 
     (
     ) 

    [[repository]] => Subdistricts 
) 
+0

Что содержит ваш '$ массив subdistrict'? Пожалуйста, print_r и показать выше. –

+0

'foreach ($ subdistricts as $ subdistrict)' снова внутри цикла? – bansi

+0

Можете ли вы дать мне весь массив $ subdistricts ?? –

ответ

0

Предполагая, что ваши данные [244,255,266] вы можете использовать эту часть кодов. Я скопировал его с here.

function combination_number($k,$n){ 
    $n = intval($n); 
    $k = intval($k); 
    if ($k > $n){ 
     return 0; 
    } elseif ($n == $k) { 
     return 1; 
    } else { 
     if ($k >= $n - $k){ 
      $l = $k+1; 
      for ($i = $l+1 ; $i <= $n ; $i++) 
       $l *= $i; 
      $m = 1; 
      for ($i = 2 ; $i <= $n-$k ; $i++) 
       $m *= $i; 
     } else { 
      $l = ($n-$k) + 1; 
      for ($i = $l+1 ; $i <= $n ; $i++) 
       $l *= $i; 
      $m = 1; 
      for ($i = 2 ; $i <= $k ; $i++) 
       $m *= $i;    
     } 
    } 
    return $l/$m; 
} 

function array_combination($le, $set){ 

    $lk = combination_number($le, count($set)); 
    $ret = array_fill(0, $lk, array_fill(0, $le, '')); 

    $temp = array(); 
    for ($i = 0 ; $i < $le ; $i++) 
     $temp[$i] = $i; 

    $ret[0] = $temp; 

    for ($i = 1 ; $i < $lk ; $i++){ 
     if ($temp[$le-1] != count($set)-1){ 
      $temp[$le-1]++; 
     } else { 
      $od = -1; 
      for ($j = $le-2 ; $j >= 0 ; $j--) 
       if ($temp[$j]+1 != $temp[$j+1]){ 
        $od = $j; 
        break; 
       } 
      if ($od == -1) 
       break; 
      $temp[$od]++; 
      for ($j = $od+1 ; $j < $le ; $j++)  
       $temp[$j] = $temp[$od]+$j-$od; 
     } 
     $ret[$i] = $temp; 
    } 
    for ($i = 0 ; $i < $lk ; $i++) 
     for ($j = 0 ; $j < $le ; $j++) 
      $ret[$i][$j] = $set[$ret[$i][$j]]; 

    $res = json_decode(json_encode($ret), false); 
    return $res; 
} 

В вашем случае, использование как следовать

$data = [244,255,266]; 

$result = array_combination(2, $data); 
for($i=0;$i<count($result);$i++) 
{ 
    print "from ".$result[$i][0]." to ".$result[$i][1]."\n"; 
} 

Выходного

from 244 to 255 
from 244 to 266 
from 255 to 266 
0
foreach ($subdistricts as $subdistrict){ 
    $originId = $subdistrict->id; 
    $exist[] = $originId; 
    foreach($subdistricts as $subdistrict_1){ 
     if(($originId != $subdistrict_1->id) || in_array($subdistrict_1->id,$exist))){ 
      $destinationId = $subdistrict_1->id; 
      echo 'from: '.$originId.' to: ' .$destinationId; 
     } 
    } 
} 

Вы можете попробовать с этим кодом bacause в программном коде переменного $ подрайона конфликт в второй.

+0

не работает на всех –

+0

Можете ли вы дать мне весь массив $ subdistricts? –

0
  1. Поскольку вы используете foreach, это создание/с помощью переменных $subdistrict дважды, и он получает перезаписаны, так что вам нужно изменить либо один (я изменил вложенную один к $subdistrict_1).
  2. В if заявления вы проверка это не то же самое ИЛИ не в массиве, в то время как вам это нужно, чтобы не быть таким же И не быть в массиве.

    foreach ($subdistricts as $subdistrict) { 
        $originId = $subdistrict->id; 
        $exist[] = $originId; 
    
        foreach($subdistricts as $subdistrict_1){ 
         if(($originId != $subdistrict_1->id) && !in_array($subdistrict_1->id, $exist)) { 
          $destinationId = $subdistrict_1->id; 
          echo 'from: '.$originId.' to: ' .$destinationId; 
         } 
        } 
    }