Собственная функция PHP, которая предоставит мне доступ к частям строки без необходимости создавать временный массив? - PullRequest
0 голосов
/ 06 ноября 2008

Я задавал этот вопрос раньше, Здесь однако я думаю, что плохо изложил проблему и получил довольно много ответов, которые, возможно, были бы полезны для кого-то, но не затрагивали фактический вопрос, и поэтому я ставлю вопрос снова.

Есть ли однострочный нативный метод в php, который позволил бы мне сделать следующее. Пожалуйста, пожалуйста, я понимаю, что есть и другие способы сделать эту простую вещь, но я задаю вопрос: существует ли что-то изначально в PHP , которое предоставит мне доступ к значениям массива напрямую без необходимости создания временного массива .

$rand_place = explode(",",loadFile("csvOf20000places.txt")){rand(0,1000)};

Это синтаксическая ошибка, однако в идеале было бы здорово, если бы это сработало!

В настоящее время кажется неизбежным, что нужно создать временный массив, т.е.

Вот чего я хочу избежать:

$temporary_places_array = explode(",",loadFile("csvOf20000places.txt"));
$rand_place = $temporary_places_array[rand(0,1000)];

Кроме того, я должен отметить, что мои настоящие намерения не состоят в том, чтобы анализировать строки или извлекать произвольно из массива. Я просто хочу получить доступ к строке без временной переменной . Это всего лишь пример, который, я надеюсь, легко понять. Часто сервисные вызовы или вещи, которые вы не контролируете, возвращают массив (например, функцию explode ()), и вы просто хотите получить к нему доступ без необходимости создания временной переменной.

ЕСТЕСТВЕННО ЕСТЕСТВЕННО ЕСТЕСТВЕННО, я знаю, что могу создать функцию, которая это делает.

Ответы [ 7 ]

3 голосов
/ 06 ноября 2008

Нет, это невозможно сделать изначально.

Вы можете, однако:

1.- Сохраните неизбежный массив вместо строки. Учитывая ограничения PHP, это то, что, по моему мнению, имеет больше смысла.

Кроме того, не забудьте, что вы можете unset ()

2.- Используйте strpos () и друзей, чтобы разобрать строку в то, что вам нужно, как показано в других ответах, которые я здесь вставлять не буду.

3.- Создать функцию.

1 голос
/ 06 ноября 2008
list($rand_place) = array_slice(explode(',', loadFile("csvOf20000places.txt")), array_rand(explode(',', loadFile("csvOf20000places.txt"))), 1);

РЕДАКТИРОВАТЬ: Хорошо, вы правы. Вопрос очень труден для понимания, но, думаю, это так. Приведенный выше код будет извлекать случайные элементы из файла CSV, но, чтобы просто извлечь все, что вы хотите, используйте это:

list($rand_place) = array_slice(explode(',', loadFile("csvOf20000places.txt")), {YOUR_NUMBER}, 1);

Замените держатель цифровой клавишей значения, которое вы хотите извлечь.

1 голос
/ 06 ноября 2008

Я знаю, что плохо отвечать на вопрос вопросом, но почему вы обеспокоены этим? Это придирка или вопрос оптимизации? Движок Zend оптимизирует это.

Однако я бы отметил, что вам не нужно создавать временную переменную обязательно :

$rand_place = explode(",",loadFile("csvOf20000places.txt"));
$rand_place = $rand_place[rand(0,1000)];

Из-за изменчивости типов вы можете повторно использовать переменную. Конечно, вы все еще не пропустите шаг.

1 голос
/ 06 ноября 2008

Не существует нативного PHP-метода для этого.

Вы можете создать такую ​​функцию:

function array_value($array, $key) {
    return $array[$key];
}

А затем используйте это так:

$places = "alabama,alaska,arizona .... zimbabway"; 
$random_place = array_value(explode(",", $places), rand(0, 1000));
0 голосов
/ 06 ноября 2008

В прошлом году я потратил большую часть времени на исследование усовершенствованного синтаксического анализа CSV для PHP, и я признаю, что было бы неплохо произвольно искать файл. Одной из моих полубезопасностей было сканирование по известному файлу и составление индекса позиции всех известных \ n, которые не были в начале строки.

   //Grab and load our index
$index = unserialize(file_get_contents('somefile.ext.ind'));
//What it looks like
$index = array( 0 => 83, 1 => 162, 2 => 178, ....);

$fHandle = fopen("somefile.ext",'RB');
$randPos = rand(0, count($index));
fseek($fHandle, $index[$randPos]);
$line = explode(",", fgets($fHandle));

Это единственный способ, которым я мог видеть, что это делается где-то близко к тому, что вам нужно. Что касается создания индекса, это элементарные вещи.

$fHandle = fopen('somefile.ext','rb');
$index = array();
for($i = 0; false !== ($char = fgetc($fHandle)); $i++){
      if($char === "\n") $index[] = $i;     
}
0 голосов
/ 06 ноября 2008

Вы можете сделать это:

<?php
function foo() {
    return new ArrayObject(explode(",", "zero,one,two"));
}
echo foo()->offsetGet(1);    // "one"
?>

К сожалению, вы не можете сделать это:

echo (new ArrayObject(explode(",", "zero,one,two")))->offsetGet(2);
0 голосов
/ 06 ноября 2008

Если это проблемы с памятью, есть другие способы решения этой проблемы, которые не разделяются на массив. Но нет, нет ничего встроенного, чтобы справиться с такой ситуацией.

В качестве альтернативы вы можете попробовать:

$pos = 0;
$num = 0;
while(($pos = strpos($places, ',', $pos+1)) !== false) {$num++;}
$which = rand(0, $num);
$num = 0;
while($num <= $which) {$pos = strpos($places, ',', $pos+1);}
$random_place = substr($places, $pos, strpos($places, ',', $pos+1));

Я не проверял это, поэтому в нем могут быть некоторые проблемы, но вы понимаете. Это можно сделать короче (и быстрее), кэшируя позиции, которые вы обрабатываете в первом цикле, но это возвращает вас к проблемам с памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...