вы можете использовать что-то вроде "//div[@class!='extras']/div[@class='phrase']"
, он должен найти все div с классом 'фраза', где родительский класс не является 'дополнением'
Разве Ваш ответ в документах PHP для json_encode не?
Для любого, кто столкнулся с проблемой частных собственностей, не добавляемых, можно просто реализовать интерфейс IteratorAggregate с getIterator () метод. Добавьте свойства, Вы хотите быть включенными в вывод в массив в getIterator () метод и возвратить его.
Даже если Ваша защищенная переменная была общедоступна вместо защищенного, у Вас не будет желаемого входа, так как это произведет весь объект как это:
[{"b":{"foo":"bar"}},{"b":{"foo":"bar"}}]
Вместо:
[{"foo":"bar"},{"foo":"bar"}]
Это, скорее всего, победит Вашу цель, но я более склонен преобразовать в json в исходном классе с методом считывания по умолчанию и призывом к значениям непосредственно
class B
{
protected $b = array( 'foo' => 'bar' );
public function __get($name)
{
return json_encode( $this->$name );
}
}
Затем Вы могли сделать с ними вообще, Вы требуете, даже вложение, которое значения в дополнительном массиве как Ваш класс A делают, но использующий json_decode.. это все еще чувствует себя несколько грязным, но работы.
class A
{
protected $a;
public function __construct()
{
$b1 = new B;
$b2 = new B;
$this->a = array( json_decode($b1->b), json_decode($b2->b) );
}
public function __toString()
{
return json_encode( $this->a );
}
}
В документации существуют некоторые ответы на эту проблему (даже если мне не нравится большинство из них, сериализируя +, разделение свойств заставляет меня чувствовать себя грязным).
Вы правы __ toString () для класса B, не называется, потому что нет никакой причины для. Таким образом для вызова его можно использовать бросок
class A
{
protected $a;
public function __construct()
{
$this->a = array( (string)new B, (string)new B );
}
public function __toString()
{
return json_encode( $this->a );
}
}
Примечание: (строка) бросок перед новым B... это назовет _toString () методом класса B, но это не получит Вас, что Вы хотите, потому что Вы столкнетесь с классиком "дважды кодирование" проблем, потому что массив кодируется в классе B _toString () метод, и это будет закодировано снова в класс _toString () метод.
Таким образом, существует выбор декодирования результата после броска, т.е.:
$this->a = array( json_decode((string)new B), json_decode((string)new B) );
или Вы испытываете необходимость для получения массива путем создания toArray () метод в классе B, который возвращает прямой массив. Который добавит некоторый код к строке выше, потому что Вы не можете использовать конструктора PHP непосредственно (Вы не можете сделать нового B ()-> toArray ();), Таким образом, у Вас могло быть что-то как:
$b1 = new B;
$b2 = new B;
$this->a = array( $b1->toArray(), $b2->toArray() );