PHP array_filter иногда возвращает объект [duplicate]

лучший способ - использовать Java7: Java 7 вводит новый способ работы с файловой системой, а также новый класс утилиты - Files. Используя класс Files, мы можем создавать, перемещать, копировать, удалять файлы и каталоги; его также можно использовать для чтения и записи в файл.

public void saveDataInFile(String data) throws IOException {
    Path path = Paths.get(fileName);
    byte[] strToBytes = data.getBytes();

    Files.write(path, strToBytes);
}

Запись с помощью FileChannel. Если вы имеете дело с большими файлами, FileChannel может быть быстрее стандартного ввода-вывода. Следующий код записывает String в файл с помощью FileChannel:

public void saveDataInFile(String data) 
  throws IOException {
    RandomAccessFile stream = new RandomAccessFile(fileName, "rw");
    FileChannel channel = stream.getChannel();
    byte[] strBytes = data.getBytes();
    ByteBuffer buffer = ByteBuffer.allocate(strBytes.length);
    buffer.put(strBytes);
    buffer.flip();
    channel.write(buffer);
    stream.close();
    channel.close();
}

Запись с помощью DataOutputStream

public void saveDataInFile(String data) throws IOException {
    FileOutputStream fos = new FileOutputStream(fileName);
    DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(fos));
    outStream.writeUTF(data);
    outStream.close();
}

Запись с помощью FileOutputStream

Давайте посмотрим, как мы можем используйте FileOutputStream для записи двоичных данных в файл. Следующий код преобразует строковый int bytes и записывает байты в файл с помощью FileOutputStream:

public void saveDataInFile(String data) throws IOException {
    FileOutputStream outputStream = new FileOutputStream(fileName);
    byte[] strToBytes = data.getBytes();
    outputStream.write(strToBytes);

    outputStream.close();
}

Write with PrintWriter мы можем использовать PrintWriter для записи форматированного текста в файл:

public void saveDataInFile() throws IOException {
    FileWriter fileWriter = new FileWriter(fileName);
    PrintWriter printWriter = new PrintWriter(fileWriter);
    printWriter.print("Some String");
    printWriter.printf("Product name is %s and its price is %d $", "iPhone", 1000);
    printWriter.close();
}

Запись с помощью BufferedWriter: используйте BufferedWriter для записи String в новый файл:

public void saveDataInFile(String data) throws IOException {
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
    writer.write(data);

    writer.close();
}

добавьте строку в существующий файл:

public void saveDataInFile(String data) throws IOException {
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true));
    writer.append(' ');
    writer.append(data);

    writer.close();
}
49
задан Michael Berkowski 30 July 2012 в 13:56
поделиться

5 ответов

Если ключи массива в вашем массиве PHP не являются последовательными числами, json_encode() должны сделать другой объект конструкцией, так как массивы JavaScript всегда последовательно индексируются по цифре. Используйте array_values() внешнюю структуру PHP, чтобы отменить исходные ключи массива и заменить их нулевой последовательной нумерацией:

Пример:

// Non-consecutive number keys are OK for PHP
// but not for a JavaScript array
$array = array(
  2 => array("Afghanistan",32,13),
  4 => array("Albania",32,12)
);

// array_values() removes the original keys and replaces
// with plain consecutive numbers
$out = array_values($array);
json_encode($out);
// [["Afghanistan",32,13],["Albania",32,12]]
119
ответ дан Michael Berkowski 20 August 2018 в 16:13
поделиться
  • 1
    +1 собирался написать то же самое. array_values ​​ - определенно способ пойти – Ben 30 July 2012 в 14:01
  • 2
    @Michael .. Может вам понадобится 78k + точек для вставки ссылок сейчас :) – Ben 30 July 2012 в 14:03
  • 3
    Я закончил здесь, когда узнал, что json_encode преобразует массив в объект без видимых причин, когда массив имеет только один элемент в нем после фильтрации с помощью array_filter. Я не знаю, имеет ли индекс массива какое-то отношение к этой отвратительной php-ошибке ", но array_values ​​разобрал его для меня. Теперь не существует json_encode массива без вызова array_values. – Mar Bar 13 July 2016 в 18:29
  • 4
    @MarBar Если массив имеет нечисловой строковый ключ или числовую клавишу из последовательности , json_encode() создаст объект {}, а не массив [], поскольку JavaScript / JSON не имеет другой способ представления такой структуры. Но да, вы можете удалить ключи с помощью array_keys(), если они не нужны в результирующей строке json. – Michael Berkowski 13 July 2016 в 18:35
  • 5
    @deblocker Трудно догадаться, что составной ключ часа подходит. Вообще, функции PHP array_*() все очень эффективны. В небольшом массиве я обычно предпочитаю использовать несколько одиночных действий array_ *, если я могу избежать циклов. Но если ваш mysqli_result большой, вы можете не захотеть скомпилировать его все в массив сразу, а затем вызвать array_values(). Вместо этого вам может быть лучше добавить строки в массив при извлечении. Все предположения, хотя я не знаю, как выглядит ваш код. – Michael Berkowski 19 October 2017 в 20:55
Функция

json_encode () поможет вам закодировать массив на JSON в php.

, если вы будете использовать только функцию json_encode напрямую без какой-либо конкретной опции, она вернет массив. Как упоминается выше вопрос

$array = array(
  2 => array("Afghanistan",32,13),
  4 => array("Albania",32,12)
);
$out = array_values($array);
json_encode($out);
// [["Afghanistan",32,13],["Albania",32,12]]

Поскольку вы пытаетесь преобразовать Array в JSON, тогда я бы предложил использовать JSON_FORCE_OBJECT в качестве дополнительной опции (параметров) в json_encode, как ниже

<?php
$array=['apple','orange','banana','strawberry'];
echo json_encode($array, JSON_FORCE_OBJECT);
// {"0":"apple","1":"orange","2":"banana","3":"strawberry"} 
?>
2
ответ дан Dinesh Gopal Chand 20 August 2018 в 16:13
поделиться
  • 1
    спасибо за JSON_FORCE_OBJECT , это все, что мне нужно – Sadik anass 25 June 2018 в 06:14

Я хочу добавить к ответу Майкла Берковски, что это также может произойти, если порядок массива будет отменен, и в этом случае немного сложнее наблюдать эту проблему, потому что в объекте json порядок будет упорядочен по возрастанию.

Например:

[
    3 => 'a',
    2 => 'b',
    1 => 'c',
    0 => 'd'
]

Вернет:

{
    0: 'd',
    1: 'c',
    2: 'b',
    3: 'a'
}

Таким образом, решение в этом случае должно использовать array_reverse перед его кодировкой json

4
ответ дан Hassaan 20 August 2018 в 16:13
поделиться

Если вы не укажете индексы в своем начальном массиве, вы получите регулярные числовые. Массивы должны иметь какой-то уникальный индекс

0
ответ дан Ray 20 August 2018 в 16:13
поделиться
1
ответ дан L VEERAPANDI BCA 31 October 2018 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: