0) { $positions = array(); foreach ($needle as $from => $to) { if (( $pos2 = stripos($result, $from, $pos1) ) === FALSE) { unset($needle[$from]); } else { $positions[$from] = $pos2; } } if (count($needle) <= 0) { break; } $winner = min($positions); $key = array_search($winner, $positions); $result = ( substr($result, 0, $winner) . $needle[$key] . substr($result, ( $winner + strlen($key))) ); $pos1 = ( $winner + strlen($needle[$key]) ); } return $result; } else { return $haystack; } } public function to_shortcode_array($value, $fields = array()) { $list = explode(',', $value); $data = array(); foreach ($list as $item) { $data[] = $this->parse_fields($item); } return $data; } private function parse_fields($value) { $data = array(); $fields = explode("|", $value); foreach ($fields as $field) { $field_data = explode(":", $field); $field_key = $field_data['0']; unset($field_data['0']); $field_value = implode(":", $field_data); $data = array_merge_recursive($data, $this->parse_field($field_key, $field_value)); } return $data; } private function parse_field($field_key, $field_value) { $keys = array_reverse(explode('_', $field_key)); foreach ($keys as $key) { $field_value = [$key => $field_value]; } return $field_value; } }