PHPQuery Выберите все значения из раскрывающегося списка

Мне нужно получить все значения выпадающего списка в массиве на основе id выпадающего меню с помощью PHPQuery.

Ниже приведен HTML:

<select name="semester" id="semester" class="inputtxt" onChange="javascript:selectSemester(this, this.form);">
    <option value="">-- Select your Semester --</option>
    <option value="2nd" selected>2nd</option>
    <option value="4th" >4th</option>
    <option value="6th" >6th</option>
    <option value="8th" >8th</option>
    <option value="SE1" >SE1</option>
    <option value="SE3" >SE3</option>
    <option value="SE5" >SE5</option>
    <option value="SE7" >SE7</option>
</select>

Я пробовал это:

$semesters = $all['#semester'];

foreach ($semesters as $semester) {
    echo pq($semester)->text();
    echo '<br>';
}

Но я получаю только один вывод со всеми конкатенированными значениями. Как получить каждое значение как отдельный элемент в массиве?

Ответ 1

Этот код отлично работает для меня:

// include part...

$ids = array();

$raw = file_get_contents("http://localhost:8000/test.html"); // your url

$doc = phpQuery::newDocument($raw);

phpQuery::selectDocument($doc);

/** @var DOMElement $opt */
foreach (pq('#semester > option') as $opt) {
    $ids[] = ($opt->getAttribute('value'));
}

print_r($ids); // check if the array has the values stored

Таким образом, результат

Array
(
    [0] => 
    [1] => 2nd
    [2] => 4th
    [3] => 6th
    [4] => 8th
    [5] => SE1
    [6] => SE3
    [7] => SE5
    [8] => SE7
)

Кстати, вы можете использовать $doc['#semester > option'] вместо pq('#semester > option'), оба варианта отлично работают. Если вам нужно опустить некоторые option - вы должны создать фильтр на основе атрибутов option, например if ($opt->getAttribute('value') != "").

Ответ 2

быстрый трюк, прежде чем изобретать велосипед, используйте simple_html_dom, вы можете найти его в http://sourceforge.net/projects/simplehtmldom/ этот класс чрезвычайно полезен в прошлом и вы можете даже изменить его, чтобы использовать его с CURL или строку, содержащую HTML-код.

Вы сможете искать объекты (теги) или идентификаторы, получать содержимое тега или итератировать более дружелюбно.

Ответ 3

Этот код должен работать. Используйте цель как "#semester option" вместо "#semester".

$semesters = $all['#semester option'];

foreach ($semesters as $semester)
{
  echo pq($semester)->text();
  echo '<br> newline';
}

Ответ 4

Легко, вам нужно выбрать селектор с идентификатором и повторить его с помощью тега, создать пустой массив и сохранить значения в нем с помощью итератора foreach.

$semsterr = array();  //empty Array

//use the option tag for iteration
foreach (pq('select#semester option') as $opt) { 
    $semsterr[] = pq($opt) -> text(); 
 // $semsterr[] = pq($opt) -> attr('value'); in case you need the value
}

print_r($semsterr); // check if the array has the values stored

Ответ 5

Вы должны проверить значение перед добавлением в массив. Как...

$sem = array();

foreach (pq('#semester option') as $opt) { 

     if(pq($opt) -> val() != '')
     {
      $sem[] = pq($opt) -> text(); 
     }
}

print_r($sem);

Удачи.. ['}

Ответ 6

//HTML//

<select name="semester" id="semester" class="inputtxt" onChange="javascript:selectSemester(this, this.form);">
<option value="">-- Select your Semester --</option>
<option value="2nd" >2nd</option>
<option value="4th" >4th</option>
<option value="6th" >6th</option>
<option value="8th" >8th</option>
<option value="SE1" >SE1</option>
<option value="SE3" >SE3</option>
<option value="SE5" >SE5</option>
<option value="SE7" >SE7</option>

//PHP//

$select = $_POST['semester'];
$count = count($select);
$i = 0;
while($i =< $count)
{
  $i++;
  echo $_POST['semester'][$i]
}