Почему я получаю массив объектов SimpleXMLElement здесь?

У меня есть код, который вытягивает HTML из внешнего источника:

$doc = new DOMDocument(); @$doc->loadHTML($html); $xml = @simplexml_import_dom($doc); // just to make xpath more simple $images = $xml->xpath('//img'); $sources = array(); 

Затем, если я добавлю все источники с этим кодом:

 foreach ($images as $i) { array_push($sources, $i['src']); } echo "<pre>"; print_r($sources); die(); 

Я получаю этот результат:

 Array ( [0] => SimpleXMLElement Object ( [0] => /images/someimage.gif ) [1] => SimpleXMLElement Object ( [0] => /images/en/someother.jpg ) .... ) 

Но когда я использую этот код:

 foreach ($images as $i) { $sources[] = (string)$i['src']; } 

Я получаю этот результат (это то, что нужно):

 Array ( [0] => /images/someimage.gif [1] => /images/en/someother.jpg ... ) 

Что вызывает эту разницу? Что отличает нас от array_push ()?

Благодаря,

EDIT: Хотя я понимаю, что ответы соответствуют тому, что я прошу (я получил), мне больше хотелось знать, почему использование array_push или другой нотации добавляет объект SimpleXMLElement, а не строку, когда оба arent литые. Я знал, что при явном нажатии на строку я получаю строку. Смотрите следующий вопрос: почему эти значения не добавляются в мой массив как строки?

Разница не вызвана array_push() но при использовании типа-cast, который вы используете во втором случае .

В первом цикле вы используете:

 array_push($sources, $i['src']); 

Это означает, что вы добавляете объекты SimpleXMLElement в свой массив.

Хотя во втором цикле вы используете:

 $sources[] = (string)$i['src']; 

Это означает (благодаря приведению в строку) , что вы добавляете строки в свой массив, а не объекты SimpleXMLElement .

В качестве справки: соответствующий раздел руководства: Type Casting .

Извините, только что заметили лучшие ответы выше, но само regex по-прежнему действует. Вы пытаетесь получить все изображения в разметке HTML? Я знаю, что вы используете PHP, но вы можете конвертировать этот пример C #, куда идти:

 List<string> links = new List<string>(); if (!string.IsNullOrEmpty(htmlSource)) { string regexImgSrc = @"<img[^>]*?src\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?>"; MatchCollection matchesImgSrc = Regex.Matches(htmlSource, regexImgSrc, RegexOptions.IgnoreCase | RegexOptions.Singleline); foreach (Match m in matchesImgSrc) { string href = m.Groups[1].Value; links.Add(href); } } 

В первом примере вы должны:

 array_push($sources, (string) $i['src']); 

Второй пример дает массив строк, потому что вы преобразовываете SimpleXMLElements в строки, используя (string) cast. В вашем первом примере вы этого не сделаете, поэтому вместо этого вы получите массив SimpleXMLElements.