Intereting Posts

Анализ многомерного массива PHP

Здесь (ниже) – это очень простой php-анализ многомерного массива, который я делаю. Я просто ищу ключ «подсветки», а затем сохраняю несколько пар значений в другом массиве. Есть ли лучший способ достичь этого (я имею в виду в отношении производительности), вместо того, чтобы иметь n циклов foreach, чтобы добраться до того, что вы хотите.

$json_O=json_decode(file_get_contents($url),true); foreach($json_O as $section1=>$items1){ if($section1==highlighting){ foreach($items1 as $section2=>$items2){ $key=$section2; foreach($items2 as $section3=>$items3){ foreach ($items3 as $section4=>$items4){ $value=$items4; $found[]=array('Key' => $key, 'Value' => $value); 

Вот пример php-объекта, который я пытаюсь проанализировать:

 Array ( [responseHeader] => Array ( [status] => 0 [QTime] => 3 [params] => Array ( [indent] => on [start] => 0 [q] => russian [fragsize] => 40 [hl.fl] => Data [wt] => json [hl] => on [rows] => 8 ) ) [response] => Array ( [numFound] => 71199 [start] => 0 [docs] => Array ...... ...... [highlighting] => Array ( [114360] => Array ( [Data] => Array ( [0] => AMEki has done it better <em>russian</em>... .... .... 

Две вещи сейчас: 1) Могу ли я сделать это быстрее? 2) Могу ли я спроектировать его лучше?

это кажется ненужным

  foreach($json_O as $section1=>$items1){ if($section1==highlighting){ foreach($items1 as $section2=>$items2){ 

вы могли бы просто сделать

  foreach($json_O['highlighting'] as $section2=>$items2){ 

упрощение остального также возможно, хотя это не проверено

 $riter = new RecursiveArrayIterator($json_O['highlighting']); $riteriter = new RecursiveIteratorIterator($riter, RecursiveIteratorIterator::LEAVES_ONLY); $found = array(); foreach ($riteriter as $key => $value) { $key = $riteriter->getSubIterator($riteriter->getDepth() - 2)->key(); $found[] = compact('key', 'value'); } 

лично, я бы просто использовал вложенные петли foreach. Это очень легко понять, в то время как мое творческое использование рекурсивных итераторов – нет.

 foreach($json_O['highlighting'] as ... ) { ... } 

Просто потому, что оно исходило от json, это не означает, что вы НЕ МОЖЕТЕ получить к нему доступ как обычный PHP-массив, потому что теперь это обычный php-массив.

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

 $higlighting = $json_0['highlighting']; foreach($highlightis as $Key => $value) { //.... } 

некоторые тесты показывают лучшую производительность for(;;) цикла for(;;) а не foreach() . и, конечно, прямой доступ к элементу массива довольно быстр